2013年2月4日月曜日

CTF Challenge Japan(Final) Write Ups - Binary 100

ファイルをバイナリエディタで開くと、ELFファイルでFreeBSD用っぽいので環境を用意してとりあえず走らせます。


パスワードを入力する必要があるようです。

stringsコマンドで文字列を抽出してみます。

「nijimasu」という文字列が、他の文字列と比較してやけに具体的なので、これをパスワードに使ってみます。

 「パスワードは12文字だよ」という返事が返ってきました。なので、とりあえず「nijimasu」に「1234」を付け加えて12文字として入力してどんな反応があるかみてみます。

コアダンプしてしまったようなので、gdbを起動してcoreファイルの中身を確認します。すると、EIPレジスタが0x34333231であることがわかります。この値はASCIIキャラクタにして「4321」、リトルエンディアンにすると「1234」になります。つまり、この4バイトの値でリターンアドレスを書き換えた結果、Segmentation faultでプログラムが終了したことになります。

runmeを動作させるだけだとここで手詰まりになってくるので、ディスアセンブラを起動してrunmeを解析します。



すると「OK! Answer is 」という文字列が使われているpublic_answer_wordというシンボル名の関数が存在することがわかります。この関数は存在するだけでプログラム本体からは参照されていない奇妙な存在であることが、ディスアセンブラの相互参照の出力状況などからわかります。この関数の開始アドレスは0x69727574です。




 0x69727574は、ASCIIでリトルエンディアンに格納すると「turi」になります。これを先ほどのパスワード入力の際、最後の4バイトの値として使うことでこの関数の先頭にEIPレジスタの値をセットすることが可能になります。


どうやらこれが回答のようです。