본문 바로가기

Games/CTF

HDCON2013 final cft2

문제로 리눅스 바이너리가 주어짐. 슈퍼데몬 형태로 돌아가기때문에 로컬쉘만 따면됨.

 

ctf2_time_patch


root@ubuntu:/var/www/hdcon2# file f4926ffc86c9ef2294dc8d93fdda1259 

f4926ffc86c9ef2294dc8d93fdda1259: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x743f954e69c57ee022488714d2fe01c0c015559a, stripped

아쉽게도 공유라이브러리를 쓰지만 감사하게도 NX, PIE 가 없음.


프로그램 기능을 요약하자면...

처음에 id 를 입력받고, 그에대한 md5 를 입력받음 그다음부터는 동적으로 5번 랜덤스트링을 주고, 그에대한 md5 를 입력받음

이 과정에서 시간제한이 있기때문에 수작업으로 하면안되고 자동화 해야함. md5 주고받기를 끝내면 아래의 함수가 실행되는데, 

단순히보면 format string 같지만 훼이크임. 좀 살펴보면 'Congratulation!!  ' 부분에 스페이스바가 있어서 절대로 if 문 속으로 들어갈 수 없음.



진짜 취약점은 아래의 string concat 을 해주는 함수에서 길이제한이 없는것.

맨처음에 id 로 입력받은 것을 Congratulation... 문자열에 붙여서 스택에 쓰는데

4바이트 이상만 붙이면 거기서부터 old ebp 를 덮어씀, 그런데 처음에 id 의 최대길이가 12바이트이므로

정확히 return address 까지 덮어쓸수 있음.


그러나 스택에 쉘코드를 넣을 공간도 마땅히 없고, 서버에 ASLR 이 걸려있는지 확인할 길도 없었기때문에

스택주소 찍는쪽으로는 안가기로했음.  만약 리턴주소 뒤의 스택을 좀더 덮어쓸수 있으면 아래의 recv 역할을 하는 함수로 ROP 해서

쉘코드로 리턴할수가 있다고 파악.


[0x8048b4e][&sh][&sh][len(sh)] 이렇게만 덮어서 리턴할수 있으면 쉘따는작업이 바로 끝나는것이지만

[0x8048b4e] 까지만 덮을수가 있어서 소용이 없었음.  나는 이것을 어떻게든 우회시켜서 ROP 가 가능하도록 할 방법을 연구하기 시작함.


그 방법으로 고안한것이 return address 를 아래의 0x8048eeb 로 덮어쓰게되면, [esp+4] 에 0x0d 보다 큰 쓰레기값이 들어있기때문에

길이제한이 없는 상태로 id 를 받는 함수를 호출할 수 있고, 다시 md5 주고받는 과정을 쭉 반복해서 취약함수로 돌아올수 있는점을 이용해

리턴주소 뒤까지 원하는만큼 덮고 리턴하는것...



그런데 원래 스택상에 id 를 받을 공간(v8)이 아래와같이 ebp-1A 부터 12바이트인데, 그 바로뒤에 v12 라는 지역변수가 있음.


문제는 이 지역변수가 output parameter 라는점임.


그래서 두번째 id 를 입력받을때는 길이제한이 없지만 취약함수로 오는 중간에 4바이트가 다시 덮어씌여짐.

그래서 그 덮어씌여지는 부분을 skip 해버리고 esp 가 [0x8048b4e][&sh][&sh][len(sh)] 를 가리키는 상태로 리턴하게 만들기위해

pop pop return 가젯을 찾았음.


결과적으로 페이로드를 다음과같이 하여 ROP exploit 성공

1차 페이로드 : [AAAA][BBBB][0x8048EEB]

2차 페이로드 : [AAAA][BBBB][&ppr가젯][쓰레기][쓰레기][0x8048b4e][&sh][&sh][len(sh)]


멘붕상태로 코딩을해서 코드가 매우 지저분하지만... 아래와같이 쉘을따는데에 성공.


풀이시간 : 4시간30분(대회마감 30분전에해결 --;;)

그런데 해설결과 md5 응답을 할때 그 뒷공간에 쉘코드를 조각내서 넣을수가 있었다고함 -_-;;

쉘코드를 조각내서 넣고, 스택주소찍어서 한번에 쉘코드로 뛰라는게 출제 의도였다고하는데...

ASLR 이 없고, 스택주소 영역을 대략 알수있다면 당연히 그방향으로 가야겠지만

서버환경을 제대로 알수없는상황에서 그게 올바른 방향인 것인지...?


'Games > CTF' 카테고리의 다른 글

PHDays 2014 FreeBDSM  (0) 2014.01.27
Whitehat RSA Signing  (0) 2014.01.07
Whitehat Contest - Pybox  (5) 2013.09.23
DEFCON 2013 penser writeup  (0) 2013.06.18
HDCON 2013 level5  (8) 2013.06.11