SECCON CTF 2014 online 予選のWrite-upをまとめました

  • 投稿日:
  • by
  • カテゴリ:

前回CTF予選に初参加しましたが、面白かったので今回のCTF予選にも参加してみました。

解いた問題は以下の7つの100点問題です。合計で700点獲得できました。

  • Welcome to SECCON(Start)
  • Easy Cipher(Crypto)
  • Shuffle(Binary)
  • Reverse it(Binary)
  • Get the key.txt(Forensics)
  • Choose the number(Programming)
  • Get the key(Network)

あと、200点問題にもチャレンジしてみましたが、こちらは途中で時間切れとなってしまいました。

さて、今回もCTF初心者ならではの100点問題ばかりのWrite-upを書いてみました。

今回はプログラムを作らないと解決できないところがあり初めてPythonを使ってみました。見るにたえないプログラムだと思いますが、こんなプログラムでも参考になればということでGithubに入れておきました。

【Welcome to SECCON】(Start)

いつもの練習用の問題で、単純にFlagを入力するだけです。

【Easy Cipher】(Crypto)

問題には以下のような数字の羅列が書かれていました。

87 101 108 1100011 0157 6d 0145 040 116 0157 100000 0164 104 1100101 32 0123 69 .....

規則性がみられます。"1100011"などの7桁の数字は0と1しかありません。これは2進数でしょう。 "0145"とか"0157"の4桁の数字は、7を超える数字がありません。また頭に0がついていて、8進数の書き方に見えます。これは8進数と想定しました。 "6d" とかはこれは16進数ですね。これ以外の数字は10進数と想定しました。

このルールで数字を全部16進数に変換して、バイナリエディタに入力しました。

1010011 0105 0103 67 79 1001110 123 87 110011 110001 67 110000 1001101 32 55 06053
53      45   43  43  4f 4e      7b  57 33     31     43 30     4d      20 37 30
S       E    C    C  O  N       {   W  3      1      C  0      M          7  0
100000 110111 0110 110011 32 53 51 0103 0103 060 0116 040 5a 0117 73 0101 7d
20     37     48   33     20 35 33 43   43   30  4e   20  5a 4f   49 41   7d
       7      H    3         5  3  C    C    0   N        Z  O    I  A    }

最後のあたりにフラグがありました。

【Shuffle】(Binary)

提供されたファイルをLinuxのfileコマンドで確認しました。

$ file shuffle 
shuffle: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped
$

86系の実行ファイルのようです。Linux上で実行するとランダムな文字列が出力されました。 この文字の出力からでは何もわかりませんでしたので、まずはバイナリエディタでそれらしき文字列がないかを確認しましたが、フラグはありませんでした。

次に、IDAという逆アセンブラで実行ファイルを解析してみたところ、以下のような怪しい部分がみつかりました。

.text:0804854B                 mov     eax, 53h
.text:08048550                 mov     [esp+24h], al
.text:08048554                 mov     eax, 45h
.text:08048559                 mov     [esp+25h], al
.text:0804855D                 mov     eax, 43h
.text:08048562                 mov     [esp+26h], al
.text:08048566                 mov     eax, 43h
.text:0804856B                 mov     [esp+27h], al
.text:0804856F                 mov     eax, 4Fh
.text:08048574                 mov     [esp+28h], al
   :(延々と続く)
.text:08048694                 mov     [esp+48h], al
.text:08048698                 mov     eax, 21h
.text:0804869D                 mov     [esp+49h], al
.text:080486A1                 mov     eax, 7Dh
.text:080486A6                 mov     [esp+4Ah], al
.text:080486AA                 mov     eax, 0
.text:080486AF                 mov     [esp+4Bh], al

これは明らかに文字列を1文字ずつ扱うことで隠そうとしている節があります。

代入している数値をバイナリエディタに入力したところ、フラグがでてきました。

【Reverse it】(Binary)

まずはfileコマンドで確認

$ file Reverseit
Reverseit: data

単なるデータのようです。

次にバイナリエディターでダンプしたところ、"02"という数字が多く並んでいるのが気になりました。

問題はReverse itですから、何かを反転させる必要がありそうです。ふと思いついたのですが、"02"の上位と下位の桁を入れ替えると"20"になります。"20"はご存知の通り空白の文字コードです。もしも空白ということであれば、その開始と終了のあたりのデータを同じように入れ替えると文字列が現れるはずです。

これを試したところ、XMLぽいコードがでてきましたが、逆向きに読めました。

これらの結果から各バイトの上位桁と下位桁を入れ替えたあとに、データの最後から最初に向けて並べ替えるプログラムをPythonでかきました。

https://github.com/kanpapa/ctf/blob/master/reverse_it.py

変換後のファイルをバイナリエディタで覗いたところ、JFIFという文字が見えました。

これはJPEGファイルではないかということで、念のためファイルコマンドでも確認しました。

$ file Reverse.jpg
Reverse.jpg: JPEG image data, JFIF standard 1.01

拡張子を.jpgに変換してビューワーでみたところ、こんな画像がでてきました。

Reverse.jpg

ご丁寧に文字の画像も反転していますので、反転して読むことでフラグが取れました

【Get the key.txt】(Forensics)

まずはいつものようにfileコマンドです。

$ file forensic100 
forensic100: Linux rev 1.0 ext2 filesystem data
$ 

Linuxのext2ファイルシステムのようです。

念のためdumpe2fsコマンドで確認したところ、間違いないようです。

$ dumpe2fs forensic100

ファイルシステムとしてマウントしてみます。

$ mkdir mnt3
$ mount forensic100 mnt3
$ cd mnt3
$ ls -l
:
:

マウントできましたが、数字のファイルがたくさんでてきました。

fileコマンドで確認するとgzipファイルでしたので、試しに1つ解凍してみると、フラグが書かれていました。

しかし、すべてのファイルにフラグが書かれているようです。これではどれが本物かわかりません。

fileコマンドの結果をよく見たところ、key.txtと書かれたものがありました。これが本物のフラグでした。

【Choose the number】(Programming)

指定されたサーバにアクセスすると以下のようなものでした。

$ nc number.quals.seccon.jp 31337
4, 7
The minimum number?
Timeout, bye.
$ nc number.quals.seccon.jp 31337
-9, 5
The maximum number? 5
8, -9, 7
The minimum number? -9
-5, -7, -8, -4
The minimum number? -8
6, 0, 0, 1, 4
The maximum number?
Wrong, bye.
$

この調子でずっと繰り返すようです。人力では最後まで辿りつけそうもありません。

自動的に回答するプログラムをPythonで作成しました。

https://github.com/kanpapa/ctf/blob/master/choose_the_number.py

試してみると100回めでフラグが取れました。

$ python choose_the_number.py
0
recvstr: -4, -7
The minimum number?
line1: -4, -7
line2: The minimum number?
strlist: ['-4', ' -7']
numlist: [-4, -7]
numlist(sort): [-7, -4]
sendstr: -7

1
recvstr: 4, 0
The maximum number?
line1: 4, 0
line2: The maximum number?
strlist: ['4', ' 0']
:
:
3231051924, 3238681159, 3338114506, 3402677356, 3425438800, 3448293469, 3573163659, 3649031632, 3662187780, 3812908271, 3816985767, 3846435394, 3982641142, 4085727022, 4156598984, 4201589254, 4277411618]
sendstr: -4177468994

recvstr: Congratulations!

recvstr: The flag is SECCON{Programming is so fun!}

【Get the key】(Network)

pcapファイルが添付されていましたので、Wiresharkに読み込みました。

BASIC認証を挟んだWebアクセスの通信ログのようです。まずは、HTTPで扱ってるファイルを抽出しました。(Export Object->HTTP)

この結果2つのHTMLファイルがでてきました。1つはAuthorization Requiredのエラー画面。もう1つはkey.htmlというファイルがダウンロードできる画面です。

この画面が見えているということは、ログにID/PWが残っているはずです。

そこで、このダウンロード画面が流れている部分のAuthorization:ヘッダにBASIC認証のIDとPasswordがあるはずなので確認したところ、WiresharkでデコードされたIDとPWがありました。

実際のサイトに接続してこのID/PWを入力することで、key.htmlを入手しフラグが取れました。

時間内に回答できたのは以上の7問になります。

あと面白そうな問題として以下の200点問題に取り組みました。

【Let's disassemble】(Binary)

指定されたサーバにアクセスすると以下のようなものでした。

$ nc disassemble.quals.seccon.jp 23168
#1 : F9
?
Timeout, bye.
$

このコードを逆アセンブルしろということでしょうか。

どんな機械語がでてくるのか適当に何回も叩いてみました。

$ nc disassemble.quals.seccon.jp 23168
#1 : 83
?
Something wrong, bye.
$ nc disassemble.quals.seccon.jp 23168
#1 : 36 14
?
Something wrong, bye.
$ nc disassemble.quals.seccon.jp 23168
#1 : CC 7B 27
?
Something wrong, bye.
$ nc disassemble.quals.seccon.jp 23168
#1 : 82
?
Something wrong, bye.
$ nc disassemble.quals.seccon.jp 23168
#1 : 14
?
Something wrong, bye.
$ nc disassemble.quals.seccon.jp 23168
#1 : 2A 56 98
?
Something wrong, bye.
$

どこか見覚えのあるような機械語です。なんとなく8ビットCPUのように思えます。

そこでものは試しとZ80の機械語表を取り出して、ハンド逆アセンブルをしてみました。

ucom82_manual.jpg

$ nc disassemble.quals.seccon.jp 23168
#1 : 6D
? LD L,L
#2 : A3
? AND E
#3 : C1
? POP BC
#4 : 96
? SUB (HL)
#5 : 39
? ADD HL,SP
#6 : B4
? OR H
#7 : 17
? RLA
#8 : 6E
? LD L,(HL)
#9 : 71
? LD (HL),C
#10 : 6B
? LD L,E
#11 : DA 75 76
? JP C,
Timeout, bye.
$

最後の行は時間切れで入力できませんでしたが、どうやらZ80で良いようです。とはいえこれも自動入力しないとtimeoutで通信が切れてしまいます。

やむなく、Pythonで自動入力の逆アセンブラプログラムを作成しはじめました。この時点であと5時間です・・・。

最初は8080の命令の範囲だけの出題かなと思って試していましたが、Z80の拡張命令も出てきて大掛かりなものになってしまいました。

作りかけのプログラムは以下におきました。これは不完全なものですのでご注意ください。

https://github.com/kanpapa/ctf/blob/master/lets_disassemble.py

途中まで実行を試した結果は以下のようになりました。いいところまでできたのですが。残念です。

$ python lets_disassemble.py
z80asm_len:  256
z80_ddasm_len:  256
z80_ddcbasm_len:  256
z80_fdcbasm_len:  256
0
recvstr: #1 : A0
? 
line1: #1 : A0
line2: ? 
strlist: ['#1', ':', 'A0']
code_len: 1
code1: A0
code1_num: 160
code1_op: AND B
asm_code: AND B
sendstr: AND B

1
recvstr: #2 : F1
? 
line1: #2 : F1
line2: ? 
strlist: ['#2', ':', 'F1']
code_len: 1
code1: F1
code1_num: 241
code1_op: POP AF
asm_code: POP AF
sendstr: POP AF
 :
 :
66
recvstr: #67 : 48
? 
line1: #67 : 48
line2: ? 
strlist: ['#67', ':', '48']
code_len: 1
code1: 48
code1_num: 72
code1_op: LD C,B
asm_code: LD C,B
sendstr: LD C,B

67
recvstr: #68 : FD CB 9C D6
? 
line1: #68 : FD CB 9C D6
line2: ? 
strlist: ['#68', ':', 'FD', 'CB', '9C', 'D6']
code_len: 4
code4_num: 214
code4_op: SET 2,(IY+d)
asm_code: SET 2,(IY+9CH)
sendstr: SET 2,(IY+9CH)

68
recvstr: Something wrong, bye.

$ 

うーん。ちゃんと早朝から取り組めば間に合ったかもです。

でも、ここまでやって200点とはやはりチームでやらないと厳しいですね。

【追記】せっかくここまでやったので、プログラムを仕上げました。

dの値がマイナスがあることを忘れていて悩んでしまいました。修正点はGithubをご覧ください。

最終結果は以下の通りでフラグも取れました。

$ python lets_disassemble.py 
z80asm_len:  256
z80_ddasm_len:  256
z80_ddcbasm_len:  256
z80_fdcbasm_len:  256
0
recvstr: #1 : B0
? 
line1: #1 : B0
line2: ? 
strlist: ['#1', ':', 'B0']
code_len: 1
code1: B0
code1_num: 176
code1_op: OR B
asm_code: OR B
sendstr: OR B

1
recvstr: #2 : FA 74 2E
? 
line1: #2 : FA 74 2E
line2: ? 
strlist: ['#2', ':', 'FA', '74', '2E']
code_len: 3
code1: FA
:
:
code2_op: BIT 7,E
asm_code: BIT 7,E
sendstr: BIT 7,E

99
recvstr: #100 : CB 2F
? 
line1: #100 : CB 2F
line2: ? 
strlist: ['#100', ':', 'CB', '2F']
code_len: 2
code2_num: 47
code2_op: SRA A
asm_code: SRA A
sendstr: SRA A

recvstr: Congratulations!

recvstr: The flag is SECCON{I love Z80. How about you?}

recvstr: 
recvstr: 
recvstr: 
recvstr: 
$

KitKatベースのFirefox OS 2.1 Flameに日本語IMEをいれてみた

  • 投稿日:
  • by
  • カテゴリ:

FlameのベースイメージがBase image v180.zipに変わっていたので、これを使ってリカバリしてみたら、どうもKitKatベースのシステムになったようです。
そういえば、Flameのページに載っているnightly buildも2.0、2.1、2.2といつの間にか変わっていました。しかも、このnightly buildは最初から日本語表示ができるようになっています。これを使えば簡単に日本語IMEの組み込みまでできるのではと考えました。

以下の手順で進めました。(作業環境はubuntuを使っています。)

1. Base image v180.zipをインストールして、FlameをKitKatの環境にする。

$ ls
Flame_2.0_v180_1.zip
$ unzip Flame_2.0_v180_1.zip
Archive: Flame_2.0_v180_1.zip
creating: Flame_2.0_v180_1/
inflating: Flame_2.0_v180_1/#flash.sh#
inflating: Flame_2.0_v180_1/boot.img
 :
$ chmod +x flash.sh
$ ./flash.sh


KitKatベースのFirefox OS 2.0で、Flameが立ち上がります。この時点では日本語は表示されません。

2. Engineering buildsのLatest aurora builds (currentry 2.1)をFlameに入れる。

最初はcurrentry 2.2で試していたのですが、たまに落ちたりしてまだ不安定に見えましたので、今回はcurrentry 2.1を使いました。また、2.1だとAPNパッチがなくても動作しました。

$ ls
b2g-34.0a2.en-US.android-arm.tar.gz gaia.zip shallow_flash.sh
$ ./shallow_flash.sh -ggaia.zip -Gb2g-34.0a2.en-US.android-arm.tar.gz
Are you sure you want to flash
Gaia: gaia.zip
Gecko: b2g-34.0a2.en-US.android-arm.tar.gz
to your Device? [y/N]y
### Waiting for device... please ensure it is connected, switched on and remote debugging is enabled in Gaia
### Restarting adb with root permissions...
  :(省略)
24 files pushed. 0 files skipped.
3135 KB/s (39144521 bytes in 12.193s)
### Push Done.
### Shallow Flash Successful!
$

これで、Firefox OS 2.1になります。何もしなくても日本語表示が可能です。でも、日本語IMEは使えないです。

3. Firefox OS 2.1のソースを落としてきて、gaiaだけbuildし、日本語キーボードを組み込む。

$ cd ~
$ git clone git://github.com/mozilla-b2g/B2G.git $ cd ~/B2G $ BRANCH=v2.1 ./config.sh flame-kk $ cd gaia/locales/ $ hg clone http://hg.mozilla.org/gaia-l10n/ja $ cp languages_dev.json languages_ja.json $ vi languages_ja.json { "en-US" : "English (US)", "ja" : "日本語" } $ cd ~/B2G $ vi .userconfig ## Gaia export LOCALE_BASEDIR=$PWD/gaia/locales export LOCALES_FILE=$PWD/gaia/locales/languages_ja.json export GAIA_DEFAULT_LOCALE=ja export GAIA_KEYBOARD_LAYOUTS=en,jp-kanji $ ./build.sh gaia including device/qcom/common/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh  :(省略) real 0m43.356s user 0m38.001s sys 0m6.989s Run |./flash.sh| to flash all partitions of your device $

4. gaiaだけFlameに書き込む。

$ ./flash.sh gaia
Detect GAIA_INSTALL_PARENT ...
 :(省略)
Push to /system/b2g ...
$

これで、日本語IMEが組み込まれたFirefox OS 2.1 Flameができあがります。

gaiaのビルドはそんなに時間がかからないので、この方法で行うと短時間で日本語IMEが動くようになります。

Firefox OS 2.2 Nightlyで、原因は不明ですが、メールの手動設定が正常に動かない状態になってしまいました。
Yahoo!メールを手動設定したあとに、メールを受信しようとすると、こんな画面になってしまいます。前回ビルドしたときはこれで動いていたのですが。
fxos_mailconfig_error.png

Gmailは自動設定になりますが、こちらは全く問題ありませんでした。
まあ、Nightlyなのでこういうバグらしきものがでてくるのは仕方ないことです。
何か解決するヒントはないかなと、ビルド環境を見ているとメールの自動設定の定義ファイルがあったので、それをYahoo!メール用に書き直してみました。
メールの自動設定の定義ファイルはビルド環境の以下のディレクトリにあります。

B2G/gaia/apps/email/autoconfig

ここに各メールプロバイダー用の設定が並んでいますので、それを参考にして次のようなテキストファイルを作り、ファイル名 yahoo.co.jpでautoconfigのディレクトリに置きました。

<clientConfig version="1.1">
  <emailProvider id="yahoo.co.jp">
    <!-- MX, for Yahoo! JAPAN -->
    <domain>yahoo.co.jp</domain>
    <displayName>Yahoo!JAPAN Mail</displayName>
    <displayShortName>Yahoo!JAPAN</displayShortName>
    <incomingServer type="imap">
      <hostname>imap.mail.yahoo.co.jp</hostname>
      <port>993</port>
      <socketType>SSL</socketType>
      <username>%EMAILLOCALPART%</username>
      <authentication>password-cleartext</authentication>
    </incomingServer>
    <outgoingServer type="smtp">
      <hostname>smtp.mail.yahoo.co.jp</hostname>
      <port>465</port>
      <socketType>SSL</socketType>
      <username>%EMAILLOCALPART%</username>
      <authentication>password-cleartext</authentication>
    </outgoingServer>
  </emailProvider>
</clientConfig>

あとは、./build.sh gaia をして、./flash.shで書き込みです。

さてこんな適当に作って試してよいのかという感じですが、そこはFlameなので。
メールアプリでYahoo!メールを設定したところ、全く問題なく自動設定ができてしまいました。
これでメールの手動設定の手間が省けるようになりました。

スイッチサイエンスさんでリフロー初体験

  • 投稿日:
  • by
  • カテゴリ:

スイッチサイエンスさんのオープンハウスに行ってきました。

そのときにリフロー体験をしてきました。クリームはんだを使うのは今回が初めてですが、うまくできるのでしょうか・・・。

作業場所はこんな感じ。チップ部品とホットプレートが並んでいます。

ssci_reflow0.jpg

今回リフローを行う基板は、マイコンとLEDと抵抗、コンデンサ、ボタン電池ホルダーを実装するようになっています。すべて表面実装の部品になります。

まず基板を固定する台に載せます。右側に見える紙がポイントです。

ssci_reflow1.jpg

紙を載せると、穴が開いていてちょうど銅はく面が見えるようになっています。

ssci_reflow2.jpg

ここでクリーム半田をへらでたっぷり塗ったあとに、へらを垂直にして銅はくの部分だけにクリーム半田がのるようにします。

ssci_reflow3.jpg

ここで紙をゆっくり剥がすと、銅はく面だけにクリーム半田がついた状態になっていることがわかります。

ssci_reflow4.jpg

ここにチップ部品をピンセットで載せていきます。位置決めを慎重に行い、位置が決まったらピンセットで上から少し押しておきます。

ssci_reflow5.jpg

いよいよホットプレートで加熱します。

ssci_reflow6.jpg

加熱するとクリーム半田が普通の半田の銀色にかわっていきます。

ssci_reflow7.jpg

見た目は問題ないようなのでボタン電池を取り付けたところ一発で動作しました。

ssci_reflow8.jpg

思ったよりは簡単にできましたが、これはあらかじめ準備が整っていたためで、個人で行う場合は型紙や固定台の作成が難関になると思います。

ちなみに、スイッチサイエンスさんではチップパーツの取り付けはこんな機械で行っていました。すごいですね。

ssci_reflow9.jpg

貴重な体験をさせていただいたスイッチサイエンスさんに感謝です。

Firefox OS 2.1をビルドして日本語IMEを組み込みFlameに書き込んでみました。
ビルド環境はubuntu 14.04 LTS (64bit) です。
以下手順の抜粋です。抜け漏れあるかもしれません。
思考錯誤で行いましたので、手順でおかしなところがあるかもしれませんが、そこは自己責任でお願いします。

まずは、Firefox OS 2.1のNightlyをBuildする環境をつくります。

$ sudo apt-get install --no-install-recommends autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib gcc-4.6 g++-4.6 g++-4.6-multilib git lib32ncurses5-dev lib32z1-dev zlib1g:amd64 zlib1g-dev:amd64 zlib1g:i386 zlib1g-dev:i386 libgl1-mesa-dev libx11-dev make zip libxml2-utils
$ cd
$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G
$ ./config.sh flame
$ ./build.sh

ここでビルドしたFirefox OS 2.1をFlameに書き込んで動作することを確認します。

次に日本語辞書を入手します。
http://sourceforge.jp/projects/naist-jdic/releases/
naist-jdic-0.4.3.tar.gzをダウンロード

ダウンロードした日本語辞書を適当なところに展開します。

$ cd ~
$ zcat naist-jdic-0.4.3.tar.gz | tar xvf - 
$ cd naist-jdic-0.4.3
$ ls -l *.dic

dicファイルをコピーして辞書を作ります。

$ cd ~/B2G/gaia/apps/keyboard/js/imes/jskanji
$ cat README
$ cd dict
$ mkdir ipadic
$ cp ~/naist-jdic-0.4.3/*.dic ipadic/. 
$ make

dict.jsonができているはずです。

Makefileに日本語キーボードを指定する。

$ cd ~/B2G/gaia
$ cp Makefile Makefile.org
$ vi Makefile
$ diff Makefile.org Makefile
*** Makefile.org	2014-08-12 01:19:13.466204000 +0900
--- Makefile	2014-08-12 02:18:46.746204000 +0900
***************
*** 395,401 ****
GAIA_CONCAT_LOCALES?=1

# This variable is for customizing the keyboard layouts in a build.
! GAIA_KEYBOARD_LAYOUTS?=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,en-Dvorak

ifeq ($(SYS),Darwin)
MD5SUM = md5 -r
--- 395,402 ----
GAIA_CONCAT_LOCALES?=1

# This variable is for customizing the keyboard layouts in a build.
! #GAIA_KEYBOARD_LAYOUTS?=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,en-Dvorak,jp-kanji
! GAIA_KEYBOARD_LAYOUTS?=en,jp-kanji

ifeq ($(SYS),Darwin)
MD5SUM = md5 -r

日本語リソースの組み込み
https://hg.mozilla.org/releases/gaia-l10n/v2_0から日本語リソースをダウンロード
ダウンロードした日本語リソースをホームディレクトリに展開

$ cd
$ unzip ja-7222e75b66ca.zip 
$ ls -l ja-7222e75b66ca/

$ cd
$ mv ja-7222e75b66ca ~/B2G/gaia/locales/ja
$ cd ~/B2G/gaia/locales/
$ cp languages_dev.json languages_own.json
$ vi languages_own.json 
$ diff -rc languages_dev.json languages_own.json
*** languages_dev.json	2014-08-11 07:51:24.924547000 +0900
--- languages_own.json	2014-08-12 02:24:28.094204000 +0900
***************
*** 1,39 ****
{
- "ar" : "عربي",
- "bg" : "български",
- "bn-BD" : "বাংলা (বাংলাদেশ)",
- "ca" : "Català",
- "cs" : "Čeština",
- "da" : "Dansk",
- "de" : "Deutsch",
- "el" : "Ελληνικά",
"en-US" : "English (US)",
! "es" : "Español",
! "eu" : "Euskara",
! "fr" : "Français",
! "gl" : "Galego",
! "hr" : "Hrvatski",
! "hu" : "Magyar",
! "it" : "Italiano",
! "ja" : "日本語",
! "km" : "ខ្មែរ",
! "ko" : "한국어",
! "lt" : "Lietuvių",
! "mk" : "Македонски",
! "ms" : "Melayu",
! "ne-NP" : "नेपाली",
! "nl" : "Nederlands",
! "pa" : "ਪੰਜਾਬੀ",
! "pl" : "Polski",
! "pt-BR" : "Português (do Brasil)",
! "ro" : "Română",
! "ru" : "Русский",
! "sk" : "Slovenčina",
! "sq" : "Shqip",
! "sr-Cyrl" : "Српски",
! "sr-Latn" : "Srpski",
! "sv-SE" : "Svenska",
! "tr" : "Türkçe",
! "zh-CN" : "中文 (简体)",
! "zh-TW" : "正體中文 (繁體)"
}
--- 1,4 ----
{
"en-US" : "English (US)",
! "ja" : "日本語"
}

環境変数を設定

$ export LOCALE_BASEDIR=$PWD/gaia/locales
$ export GAIA_DEFAULT_LOCALE=ja
$ export LOCALES_FILE=$PWD/gaia/locales/languages_own.json

APNのパッチを行う。

$ cd $ unzip firefoxos-patch-master.zip $ cd ~/B2G/gaia/shared/resources $ patch apn.json ~/firefoxos-patch-master/apn.json.diff

gaiaを再ビルドする。

$ cd ~/B2G
$ ./build.sh gaia

Flameに書き込み

$ cd ~/B2G
$ ./flash.sh

これで日本語入力ができるようになります。
ここではまだFMラジオパッチを組み込んでいませんが、このビルドツリーに反映してしまえば毎回パッチも不要です。

fxos21_kanji_ime.jpg

Firefox OS FlameにNightly buildをいれて日本語表示をしてみた

  • 投稿日:
  • by
  • カテゴリ:

Firefox OS Flameを手に入れました。でも、購入時点だとFirefox OS 1.3で日本語画面ではありませんでした。

FlameのページにNightly build (Firefox OS 2.1)がリンクされていましたので、これと入れ替えてみました。

私はMacBook Airを使っていますので、adb-fastboot-installをインストールしてadbやfastbootが動く状態にしています。

以下の3つの必要なファイルをMacにダウンロードして、適当なフォルダにいれておきます。

  • b2g-34.0a1.en-US.android-arm.tar.gz (ファイル名はその都度変わります)
  • gaia.zip
  • shallow_flash.sh

作業の前にFlameの環境設定でリモートデバッグを有効にしておくことと、途中で端末ロックがかからないように画面ロックを無効にしておきます。

Macのターミナルを立ち上げて、先ほどのフォルダに移動します。

$ cd ~/Desktop/Flame

実行権限をつけます。

$ chmod +x ./shallow_flash.sh

書き込みのスクリプトを実行します。

$ ./shallow_flash.sh -g gaia.zip -G b2g-34.0a1.en-US.android-arm.tar.gz
Are you sure you want to flash 
Gaia: gaia.zip 
Gecko: b2g-34.0a1.en-US.android-arm.tar.gz 
to your Device? [y/N]y ←Yと入力。
### Waiting for device... please ensure it is connected, switched on and remote debugging is enabled in Gaia
### Restarting adb with root permissions...
adbd is already running as root
### Remounting the /system partition...
remount succeeded
### Stopping b2g process...
### Processing Gaia: gaia.zip
### Unzip gaia.zip to /var/folders/83/rk2h8hb12fs8ft2v0f68zyqm0000gn/T/shallowflashgaia.XXXXXXXXXXXX.CorEeLCJ ...
### Cleaning Gaia and Profiles ...
rm failed for /data/local/svoperapps, No such file or directory
rm failed for /data/local/user.js, No such file or directory
rm failed for /data/local/indexedDB, No such file or directory
### Cleaning Done.
### Pushing Gaia to device ...
push: /var/folders/83/rk2h8hb12fs8ft2v0f68zyqm0000gn/T/shallowflashgaia.XXXXXXXXXXXX.CorEeLCJ/gaia/profile/webapps/bluetooth.gaiamobile.org/manifest.webapp -> /system/b2g/webapps/bluetooth.gaiamobile.org/manifest.webapp
push: /var/folders/83/rk2h8hb12fs8ft2v0f68zyqm0000gn/T/shallowflashgaia.XXXXXXXXXXXX.CorEeLCJ/gaia/profile/webapps/bluetooth.gaiamobile.org/application.zip -> /system/b2g/webapps/bluetooth.gaiamobile.org/application.zip
:
:(中略)
:
push: /var/folders/83/rk2h8hb12fs8ft2v0f68zyqm0000gn/T/shallowflashgecko.XXXXXXXXXXXX.sH1PJPqC/b2g/b2g -> /system/b2g/b2g
push: /var/folders/83/rk2h8hb12fs8ft2v0f68zyqm0000gn/T/shallowflashgecko.XXXXXXXXXXXX.sH1PJPqC/b2g/application.ini -> /system/b2g/application.ini
24 files pushed. 0 files skipped.
3746 KB/s (38943826 bytes in 10.151s)
### Push Done.
error: protocol fault (no status) ←エラーのようですが問題なさそうです。
### Shallow Flash Successful!
$

これで、リブートするとFirefox OS 2.1が立ち上がります。

環境設定で確認すると2.1.0.0-prereleaseとなっていました。

初期設定で日本語が選択できますので、それを選択するとホーム画面や各種表示が日本語になります。

残念ながら日本語IMEは組み込まれていないので、自分でビルドするしかありませんが、手っ取り早く最新の環境を使ってみるのも面白いのではと思います。

なお、すでに公開されているAPNパッチとFMラジオパッチはそのまま使えました。

ホーム画面のスクリーンショットを撮ってみましたが、Firefox OS 2.1では音量を下げるボタンとホームボタンの同時押しに変更になっています。

flame_fxos21_screen.jpg

SECCON 2014 CTFに初めて参加しました

  • 投稿日:
  • by
  • カテゴリ:

先日、CTF for Beginnersに参加しましたので、初めてCTF予選にも参加してみました。

解いた問題は以下の6つです。合計で600点獲得できました。

  • 練習問題(100点)
  • このパケットを解析せよ(100点)
  • decode me(100点)
  • 箱庭SQLiチャレンジ(100点)
  • 重ねてみよう(100点)
  • 879,394bytes(100点)

CTF初心者ですが、Write-upを書いてみました。

【練習問題】

練習用の問題で、単純にFlagを入力するだけです。

【このパケットを解析せよ】

seccon2014.pcapngをWiresharkに読み込んだところ、FTPの通信ログのようです。flag.txtというファイルをGETしていましたので、このファイルのデータを読んだところこんな内容が。

RkxBR3tGN1AgMTUgTjA3IDUzQ1VSM30=

BASE64ぽいのでデコードしたらFlagがでてきました。

【decode me】

encoded.txtの内容をバイナリエディタでみたところ、

FRPPBA 2014
ebg13/47

という文字列が。

FRPPBA 2014はSECCON 2014なのかなと推測し、並べてみたところ規則性が。

FRPPBA 2014→SECCON 2014
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

これってROT13という暗号方式らしいです。でもバイナリをみる限りどうも2バイト文字も含まれているようで、それを扱うにはROT47というものがあるらしいです。

これも ebg13/47 → rot13/47 と一致しますし。

これを扱えるツールはnkfらしいので、Windows版のnkfをインストールして、表示してみたら・・・

>nkf -r encoded.txt
SECCON 2014 に参加のみなさまこんにちは。 rot13/47 に気付くとは流石です。 nkfコマンドで簡単にデコードできることにも気付きましたか? というわけで、おめでとうございます! フラグは半角英数文字に変換してから入力してください。 FLAG{Have fun SECCON2014}

これでFlagがとれました。

【箱庭SQLiチャレンジ

手始めに以下を入力

' OR 1=1--
ID=0 NAME=Tanaka AGE=54 ADDRESS=Tokyo SALARY=90000.0 ID=1 NAME=Paul AGE=32 ADDRESS=California SALARY=20000.0 ID=2 NAME=Allen AGE=25 ADDRESS=Texas SALARY=15000.0 ID=3 NAME=Teddy AGE=23 ADDRESS=Norway SALARY=20000.0 ID=4 NAME=Mark AGE=25 ADDRESS=Rich-Mond SALARY=65000.0

おやおや。丸見えです。でも、Flagはここではなさそうです。

他のテーブルをみてみたいので次のように入力。

' OR 1=1 ; SELECT sql FROM sqlite_master; --
ID=0 NAME=Tanaka AGE=54 ADDRESS=Tokyo SALARY=90000.0 ID=1 NAME=Paul AGE=32 ADDRESS=California SALARY=20000.0 ID=2 NAME=Allen AGE=25 ADDRESS=Texas SALARY=15000.0 ID=3 NAME=Teddy AGE=23 ADDRESS=Norway SALARY=20000.0 ID=4 NAME=Mark AGE=25 ADDRESS=Rich-Mond SALARY=65000.0 sql=CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL,AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ) sql=NULL sql=CREATE TABLE SECCON(FLAG TEXT NOT NULL)

SQLコマンドの履歴が見えました。CREATE TABLEでテーブル名やスキーマがわかりました。SECCONというテーブルがあるようです。しかも、FLAG というTEXTがあります。これですね。

' OR 1=1 ; SELECT * FROM SECCON; --
ID=0 NAME=Tanaka AGE=54 ADDRESS=Tokyo SALARY=90000.0 ID=1 NAME=Paul AGE=32 ADDRESS=California SALARY=20000.0 ID=2 NAME=Allen AGE=25 ADDRESS=Texas SALARY=15000.0 ID=3 NAME=Teddy AGE=23 ADDRESS=Norway SALARY=20000.0 ID=4 NAME=Mark AGE=25 ADDRESS=Rich-Mond SALARY=65000.0 FLAG=FLAG{EnjoySQLi}

これでFlagがとれました。

【重ねてみよう

afterimage.gifというアニメーションGIFのファイルが提供されました。白い点がランダムに表示されるものです。

afterimage.jpg

問題の通り各コマを重ねると何か見えるのでしょう。

とりあえずアニメーションGIFを作成するようなツールを探してみたところ、Giamというツールがありましたので、これでafterimage.gifを読み込みました。次にツールで重ねて表示してみたところ、

WS000000.jpg

QRコードらしきものが現れました。画像を白黒反転をしてiPhoneのQRコードで読み取るとFlagがとれました。

【879,394bytes

Filesystem001.binというファイルシステムのデータのようです。

ファイルサイズが 879,394bytesのファイル名を答えろとのことなので、とりあえず879,394をHEXにしたところ、D6B22になります。これがファイルサイズとしてどこかにあるはずです。

たぶんFAT32だと思うので、バイナリエディタで開いてファイル名らしきものをキーにFATの構造に照らし合わせてファイルサイズが先ほどのHEX値と同じものを見つけました。でもロングファイル名のようです。次にVFATの構造と照らし合わせて、ロングファイル名を求めました。それがFlagでした。

以上、今回は初めての参加で、100点の問題ばかりで終わってしまいましたが、参加されたかたのwrite-upを参考にしてテクニックを身につけたいと思います。

でもFlagがとれたときは気持ちいいですね。次回もぜひ参加してみたいと思います。

VFDシールドを修理しました

  • 投稿日:
  • by
  • カテゴリ:

以前製作したVFDシールドを落っことしてしまいまして、VFD(蛍光表示管)が1つ割れてしまいました。

repair_vfd1.jpg

危険なので割れたVFDを取り外します。リード線を切断して取り外したのちに、はんだシュッ太郎でハンダを除去しました。

repair_vfd2.jpg

デジットさんにVFDを注文して到着しました。

repair_vfd3.jpg

さっそく取り付けます。こんな感じかな。

repair_vfd4.jpg

VFDシールドの修理完了です。無事点灯しました。

repair_vfd5.jpg

VFDのスペアを買っておいたのでまた割れても大丈夫かな。

iMacのDVDドライブをSSDに交換してみた(組立編)

  • 投稿日:
  • by
  • カテゴリ:

iMacのDVDドライブをSSDに交換してみた(換装編)からの続きです。

iMacの分解はリスクもありますので自己責任でお願いします。

SSDドライブへの交換が完了しましたので、iMacを組み立てていきます。分解と逆の手順で進めていきます。

90度縦にしている液晶画面パネルを元の位置に戻します。このとき不用意にケーブルを引っ張ったりせず、指紋を液晶画面パネルにつけないように注意して作業します。

縦置きにした状態で、ケーブルを元通りに取り付けていきます。

左側は2本

imacstep23.jpg

中央も2本

imacstep24.jpg

ケーブルの取り付けが完了したら、液晶画面パネルを元の位置に戻して、静かに本体を倒します。

imacstep25.jpg

液晶画面パネルを固定していた8本のT-8ネジを締めて固定します。

液晶画面に指紋がついてしまった場合はここで丁寧に拭き取ります。私の場合はiPhoneの液晶画面保護シートを貼るときに使ったクリーニングクロスを使いました。

次に外してあったアクリル板を取り付けます。強力な磁力で本体とくっつきますので位置決めに注意しながら正しい位置で固定します。

imacstep26.jpg

いよいよ電源投入です。4つのドライブが表示されました。SSDはあらかじめiMacにUSBで接続してMacOS Xをインストール済ですのでこのように認識します。

imacstep27.jpg

SSDを選んで起動してみます。

imacstep28.jpg

速い!これまでとは比べ物にならないスピードで起動しました。

imacstep29.jpg

無事SSD交換完了です。あとはTRIMの設定と環境設定の移行を進めて終了です。

iMacの旧起動ディスクである内蔵の500GBにはiPhotoのライブラリを置くことにし、それ以外はすべてSSDに移行しました。

起動ディスクになったSSDはTime Capsuleで自動バックアップされますが、iPhotoライブラリが入った旧起動ディスクはバックアップされないので、その点は工夫しないといけません。定期的にバックアップするための外付けHDDを接続して対応することにしました。標準機能でバックアップできるとよいのですが。

ちなみにこの作業で我が家のWindows PCとMacはすべてSSD実装済となりました。

iMacのDVDドライブをSSDに交換してみた(換装編)

  • 投稿日:
  • by
  • カテゴリ:

iMacのDVDドライブをSSDに交換してみた(分解編)からの続きです。

iMacの分解はリスクもありますので自己責任でお願いします。

DVDドライブを観察すると、温度センサーらしきものが張り付いています。

imacstep10.jpg

ゆっくり保護シールを剥ぐと基板が見えます。慎重に基板本体も剥いでいきます。

imacstep11.jpg

次にDVDドライブを固定しているユニットの4本のT-8ネジを外します。

ここに2カ所

imacstep12.jpg

さらに2カ所あります。

imacstep13.jpg

4本のネジを外すとDVDユニットが外れます。

imacstep14.jpg

外したDVDユニットはこんな感じです。

imacstep15.jpg

DVDドライブを取り外すために、電磁シールドのアルミシールを剥がします。

imacstep16.jpg

DVDドライブを固定している4本のネジを外すと、DVDドライブが取り外せます。

imacstep17.jpg

ここでDVDドライブをSSDドライブに交換できるキットの出番です。

まずキットにSSDをとりつけます。これでSSDドライブの大きさと接続コネクタがDVDドライブと同じになります。

imacstep18.jpg

先ほどのプラスチックの枠にSSDドライブ交換キットを取り付けます。

ここで1つ問題があり、プラスチックの枠に2つほど小さな爪がでていて、それが邪魔になります。

imacstep19.jpg

私の場合は、この2つの爪はニッパーで折ってしまいました。もうDVDを載せることはないでしょうから。

imacstep20.jpg

DVDドライブを取り付ける要領で、SSDドライブを取り付けます。剥がしたアルミシールをもとに戻します。

imacstep21.jpg

DVDユニットをiMac本体に取り付けて、T-8ネジで固定します。温度センサーもSSDのケースにくっつけます。

imacstep22.jpg

これでDVDからSSDへの交換が終わりました。

このあとiMacのDVDドライブをSSDに交換してみた(組立編)に進みます。