FTZ Level 16


hintは以下の通りです.

今回は3つの関数があります.main関数を表示すると、callというvoidポインタにprintit関数を入れるアドレスが表示され、fgets関数が実行された後に呼び出されます.
20バイトのbufでは48バイトの入力が許可されるため、バッファオーバーフローが発生する可能性があります.
Shell関数は17番目の階層Shellに与えられた関数であるが,どこにも呼び出されていない.
では、callポインタの値をshell関数の開始アドレスに変更してもいいですか?
今回もポインタを使ったので、そのままgdbで開けてみましょう.

スタックに0 x 38(56バイト)の空間が割り当てられている.
fgets関数を呼び出すに基づいて議論しましょう.
パラメータはbuf、48、stdinの順に渡されます.は0 x 30(10進48)を押しているので、[ebp-56]がbufの位置であることがわかります.
を見ると、もう一つのcallは、上の行で[ebp-16]をeaxに、で0 x 8048500を[ebp-16]に入れます.printitの開始アドレスが0 x 8048500なら?printit関数は[ebp−16]に位置する.
printit関数を開きます.

予想外にprintit関数の開始アドレスは0 x 08048500です.すなわちprintitは[ebp−16]で呼び出される.
このアドレスをshell関数の開始アドレスに変更する必要があります.
shell関数を開きます.

shell関数の開始アドレスは0 x 080484 d 0です.
スタックの構造は次のとおりです.

上図に示すように、callより前の40バイトを無意味な文字に塗りつぶし、残りの4バイトをshell関数の開始アドレスに塗りつぶすだけでよい.
攻撃命令は以下の通り.
(python -c 'print "A"*40+"\xd0\x84\x04\x08"'; cat) | ./attackme

Level 17のShellをゲット.