問題
解いてみた
まずはプログラムをダウンロードします。
mainというファイルでした。
念のためBZで見てみます。
ELFファイルでした。
一応「pico」で検索してみましたが、ありませんでした。
とりあえず動かしてみます。
一応オーバーフロー的な話の可能性もあるので大量の文字を入力してみます。
特に変化はありません。
IDAを使ってみます。
mainの中ごろに起動したときに表示される文字列があります。
その間でcallされているdo_magicが怪しいので中を見てみます。
ループがあったあとに分岐があって「You are winner」とか書いてあるのでここに行けるようにしたらうれしいことがありそうです。
ループの中身を見てみます。
8048858hっていうのはダブルクリックすると
だということがわかります。
greetingMessageっていうのはこれもダブルクリックして
だということがわかります。
処理の流れとしては8048858hと入力した文字列をXORしてその結果のバイトとgreetingMessageを比較している風です。ちょっと自信ないですが、とりあえずこれでやってみます。
入力文字 xor 8048858h = greetingMessage
を満たすような入力文字が知りたい。
xorの性質から、上記の式がなりたつなら
8048858h xor greetingMessage = 入力文字
も成り立つはずなのでそれを調べる。
8048858hのHEXはIDAに書いてある通りで
0x29 0x06 0x16 0x4F 0x2B 0x35 0x30 0x1E 0x51 0x1B 0x5B 0x14 0x4B 0x08 0x5D 0x2B 0x56 0x47 0x57 0x50 0x16 0x4D 0x51 0x51 0x5D
です。
greetingMessageはpythonを使いました。
こんな感じでしょうか。
これを実行すると以下の配列が得られます。
['0x59', '0x6f', '0x75', '0x20', '0x68', '0x61', '0x76', '0x65', '0x20', '0x6e', '0x6f', '0x77', '0x20', '0x65', '0x6e', '0x74', '0x65', '0x72', '0x65', '0x64', '0x20', '0x74', '0x68', '0x65', '0x20', '0x44', '0x75', '0x63', '0x6b', '0x20', '0x57', '0x65', '0x62', '0x2c', '0x20', '0x61', '0x6e', '0x64']
この2つをxorします。これもpythonで。
こんな感じでしょうか。
この結果は
でた!
けど、まさかのこの答えは間違いでした。。。
XORする元のHEXが違うんでしょうか。
ヒント見てみます。
んーオブジェクトダンプしましょう。みたいなことですよね。
何か間違いがあるかもしれないのでもう一度見直してみます。
同じやり方を試してもしょうがないので他のやり方で。
gdbで起動してdo_magicを見てみます。
gdb ./main
~中略~
(gdb) disas do_magic
途中で文字列が書き換えていることを考慮してbreakpointで0x080486c0でとめて、そのときの0x8048858を見てみます。
まず止めます。
ここで0x8048858を見ます。
同じですね。。。
ちなみに今扱っているELFファイルは問題文のリンクからファイルをダウンロードしたんですが、 /problems/quackme_2_45804bbb593f90c3b4cefabe60c1c4e2. からアクセスできるファイルで検証してみます。
はい、違いますね。。。
29 06 16 4F 2B 35 30 1E 51 1B 5B 14 4B 08 5D 2B 53 10 54 51 43 4D 5C 54 5D
29 06 16 4f 2b 35 30 1e 51 1b 5b 14 4b 08 5d 2b 56 47 57 50 16 4d 51 51 5d
上がリンクからダウンロードしたもので、下がshellから取ったものです。後半が違いますね。
まさかダミーを仕掛ける罠があるとは思ってませんでしたよ。
問題の横に書いてある解けた人数1195人の人たちは最初からこれに気づいたんでしょうか。
これでpythonを直してみます。
これで実行してみます。
違うのが出ました。これで再度mainを実行してみます。
You are winner 出ましたー。