write-ups/CTF

DIMICTF xml_parser write up

2017. 12. 10. 01:00

최근에 H3X0R 서버를 돌아보다가 현이가 저장해놓았던 CTF 목록 중에 DIMI-CTF가 있길래 한 번 풀어보았다. 


(난 참고로, DIMI-CTF 당시 포너블을 아예 1도 할 줄 몰랐었기 때문에 포너블은 하나도 못풀었다.)


Analyse

 일단 문제의 컨셉은 사용자로부터 입력받은 XML을 파싱해서 추력해주는 것이다. 아래 사진을 보면 알 수 있다. 


먼저 checksec를 통해서 어떤 보호기법이 걸려있는지 확인해보자. 


카나리와 PIE가 걸려있지 않으니 쉽게 풀 수 있을 듯하다. 

그럼 이제는 헥스레이를 통해서 구체적으로 어떤 기능이 있는지 확인해보자. 



메인 함수에서는 read() 함수로 사용자로부터 xml 문자열을 1024byte만큼 받고 있다. 사용자에게서 xml을 받기 전에 memset으로 모두 널바이트로 초기화하는 것도 보인다. 


다음은 xml_parse() 함수를 헥스레이로 본 것이다. 



while(1)문으로 xml 태그를 파싱하고 그 안에 있는 내용들을 저장한 후, 출력한다. 취약점이 있을 만한 곳은 strncpy() 함수밖에 없다. 


밑에 malloc() 으로 heap 공간 할당 후, strncpy() 함수를 호출한 부분은 heap exploit 문제라면 유용하게 사용했겠지만, 적어도 이 문제를 풀 때는 쓸모가 없다ㅜㅜㅠ


위에 contents를 parsing하는 부분에서 취약점이 나타난다. 



xml_string - src 라는 것이 어떤 의미가 있는 건지는 정확히 모르겠지만, 

취약점이 발생한다. 


공격 시나리오

IDA에서 shift + f12를 눌러봤다. 


/home/xml_parser/flag 라는 문자열이 있다. ctrl + x 로 이 문자열을 어디서 사용하나 봤는데, 아니나 다를까!



real_flag()라는 함수가 있었다. RET을 0x080489F8 값으로 덮어쓰면 플래그를 얻을 수 있는 거시다!!@#@!!


그리고 EIP값은 <a>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</a> 이런 값을 집어넣어서 변조하면 된다. 



Exploit

시나리오에서 썼던 xml 값을 집어넣어보면, 



segmentation fault가 뜬다. core 파일을 확인해보니까 



EIP가 정상적으로 바뀐 것을 알 수 있다. 그럼 이제 Offset을 정확히 구하기 위해 다음 사이트를 이용하겠다. 


오프셋을 구했으니, 이제 페이로드를 짜보자. 



이렇게 만들어따. 



이렇게 /home/xml_parser/flag 파일이 정상적으로 읽히는 것을 알 수 있다. ㅅㅅ

(/home/xml_parser/flag 파일은 임의로 만든 파일입니다)

'write-ups > CTF' 카테고리의 다른 글

plaid ctf 2013 ropasaurusrex write up  (0) 2017.12.14
codegate 2017 EasyMISC write up  (0) 2017.12.13
화이트햇 콘테스트 familiar write-up  (0) 2017.11.07
Kiwi CTF write up  (0) 2017.10.16
defcamp CTF write up  (0) 2017.10.03