문제로 리눅스 바이너리가 주어짐. 슈퍼데몬 형태로 돌아가기때문에 로컬쉘만 따면됨.
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 |