ipwn
[FTZ(Free Training Zone)] level12 -> level13 본문
ID : level12
PW : it is like this
[level12@ftz level12]$ ls -l total 28 -rwsr-x--- 1 level13 level12 13771 Mar 8 2003 attackme -rw-r----- 1 root level12 204 Mar 8 2003 hint drwxr-xr-x 2 root level12 4096 Feb 24 2002 public_html drwxrwxr-x 2 root level12 4096 Feb 22 12:39 tmp |
hint파일을 한 번 읽어보겠다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main( void ) { char str[256]; setreuid( 3093, 3093 ); printf( "문장을 입력하세요.\n" ); gets( str ); printf( "%s\n", str ); } |
str문자열이 제한없이 입력이 되고, 그로인해 ret을 변조시켜 shellcode를 실행시키는 문제이다.
일단 가장먼저 str과 sfp 사이의 dummy값이 얼마나 있는지 한 번 보도록 하겠다.
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 0xc15 0x08048481 <main+17>: push 0xc15 0x08048486 <main+22>: call 0x804835c <setreuid> 0x0804848b <main+27>: add esp,0x10 0x0804848e <main+30>: sub esp,0xc 0x08048491 <main+33>: push 0x8048538 0x08048496 <main+38>: call 0x804834c <printf> 0x0804849b <main+43>: add esp,0x10 0x0804849e <main+46>: sub esp,0xc 0x080484a1 <main+49>: lea eax,[ebp-264] 0x080484a7 <main+55>: push eax 0x080484a8 <main+56>: call 0x804831c <gets> 0x080484ad <main+61>: add esp,0x10 0x080484b0 <main+64>: sub esp,0x8 0x080484b3 <main+67>: lea eax,[ebp-264] 0x080484b9 <main+73>: push eax 0x080484ba <main+74>: push 0x804854c 0x080484bf <main+79>: call 0x804834c <printf> 0x080484c4 <main+84>: add esp,0x10 0x080484c7 <main+87>: leave 0x080484c8 <main+88>: ret 0x080484c9 <main+89>: lea esi,[esi] 0x080484cc <main+92>: nop 0x080484cd <main+93>: nop 0x080484ce <main+94>: nop 0x080484cf <main+95>: nop End of assembler dump. |
str의 공간은 256byte, 즉 0x100이 할당되어있는데, sfp까지의 거리는 0x108, 즉 264byte의 공간이 할당되어있다.
그러므로 str과 sfp의 사이에는 8byte의 dummy가 껴있다는 것을 알 수 있다.
이제 ret을 변조하기 위해서는, 총 268byte(str[256] + dummy[8] + sfp[4])를 덮어주어야 한다는 것을 알 수 있다.
이제 한 번 tmp디렉토리에 있는 복사파일에 ret을 덮어주고, 그 뒤에는 nop과 shellcode로 덮어주어보겠다.
gets함수등 사용자의 입력을 main함수의 인자로 받지않는 경우에는 (python -c 'print "~~~"';cat)|./file name의 형태로
값을 넘겨주어야 한다.
일단 core dump를 보도록 하겠다.
eip가 제대로 변조된 것을 확인할 수 있다.
이제 메모리를 확인해보도록 하겠다.
nop이 쌓여있는 위치를 확인했다.
이제 저 위치 중 아무 것이나 ret으로 변조해주면, ASLR로 인한 몇 번의 segmentation fault 이후에 shell이 가져와질 것이다.
한 번 밖에 segmentation fault가 뜨지 않았고, 성공적으로 shell이 가져와진 것을 확인할 수 있다.
이제 홈디렉토리로 돌아가서 원본파일을 공격해서, 권한이 상승된 shell을 가져오겠다.
성공적으로 몇 번의 segmentation fault를 거쳐서 권한이 상승한 shell을 가져왔다.
NEXT ID : level13
NEXT PW : have no clue
'Write up > FTZ' 카테고리의 다른 글
[FTZ(Free Training Zone)] level11 -> level12 (0) | 2018.02.06 |
---|