본문 바로가기

System Hacking/CTF

CodeGate 2015 Quals - Mashed Potato

CodeGate 2015 Quals - Pwnable 600pt, Mashed Potato



메모리 보호기법은 SSP와 NX, ASLR만 걸려있는 상황이고,

비슷한 환경으로 구성하고 다시 풀어봤다. ( 로컬 환경 구성 : Ubuntu Linux 14.04 x86_64 )



먼저 취약점으로 보이는 부분은 바로 보인다. leave_plain() 함수 내부에서 fgets 입력을 2번 받는데, 첫번째로 입력받은 값만큼 2번째 입력을 받는다. 이 부분에서 BOF가 발생하는데, SSP가 걸려있기 때문에 canary 값을 알아내야 했다.


사실 바이너리 자체는 로그를 남기는 기능만 했는데, 선택지가 2개밖에 없기 때문에 ( 1. 암호화 // 2. 평문 // 3. 종료 )

그냥 바로 암호화 부분의 함수를 보면..



입력받을 최대 길이를 지정하고, 메세지를 입력받는다. (이 부분에서도 BOF 발생)

그리고 encrypt_data 함수를 통해 암호화하는데, 

사용자로부터 '입력받은 메세지의 길이'가 아니라 사용자가 지정한 '입력받을 길이'를 전달한다.


일단 먼저 encrypt_data 함수의 내용을 확인해보면..


deflate 라는 함수와 xor 연산을 통해서 암호화를 진행하는데, deflate 함수에 대해서 찾아보니

암호화 함수가 아니라 zlib에서 사용하는 압축 함수 였다. 찾아보니 deflate 함수는 LZ77 알고리즘과 Huffman 알고리즘 2가지를 섞어 사용하고, 이 문제에서는 최종적으로 압축된 데이터의 크기를 결과값(msg.log에 쓰여진 메세지 크기)으로 출력해준다.

이 문제의 경우, 위에서 확인한것처럼 압축되는 데이터의 길이를 조절할 수 있기 때문에, 압축되는 데이터의 범위를 조절하고, 압축되는 데이터값을 조절하여 출력값을 비교한다면 원하는 데이터값들을 알아낼 수 있다.


다시 LZ77 알고리즘과 Huffman 알고리즘에 대하여 보면.. (허프만 코드는 너무 유명해서 생략)

LZ77 알고리즘에 대한 정보는 아래 링크에서 자세히 볼 수 있는데, 내가 이해한대로는..

압축하려는 데이터가 이전에도 존재했었는지 확인하여 반복적으로 나타나는 데이터를 압축하는 알고리즘 같다.

이때 데이터의 기준은 최소 3바이트 이상이고 1바이트 단위로 중복되는 부분들을 모두 찾는다.


 - LZ77 알고리즘 관련 자료 : http://egloos.zum.com/studyfoss/v/5355158

 - Huffman 알고리즘 관련 자료 : http://studyfoss.egloos.com/5356876


이제 이 점을 이용해서 Canary를 찾은 방법을 확인해보자면..


canary는 브루트포싱을 통해서 알아냈다. 먼저 3바이트 이상이고, 중복되는 부분들은 압축된다는 점을 이용했다.

이 때 중요한 점은, 압축률을 통해 canary 값을 알아내려면 1바이트만큼 더 압축이 되었는지 그렇지 않은지를 확인해야 한다.

(브루트 포싱 값을 1바이트씩 증가시킬 때, 만약 canary값이랑 일치한다면 -> 1바이트만큼 더 압축이 될 것이다.)

최대한 압축해야하는게 아니고 canary 값만을 찾아내면 되므로, 이 부분을 주의하며 압축 범위와 데이터를 조절해야한다.


여러번 삽질해본 결과.. 저런 식으로 8바이트 중복되는부분("\x00"*8) + canary(1바이트~ 8바이트)를 늘려가면서 브루트 포싱하는게 가장 깔끔하게 나오는 것 같다. 어떤 부분이 문제인지는 모르겠는데 가끔 안됨..





대회 당시에 라이브러리 파일이 주어졌기 때문에 익스플로잇 자체는 쉽게 짤 수 있었다. 사실 이 문제의 경우 꽈배기처럼 익스플로잇을 짜면 스테이지를 2개 정도 더 추가하여 GOT 테이블에 적힌 라이브러리 함수들간의 오프셋을 통해 라이브러리 파일을 알아낼 수도 있다.


익스플로잇 흐름은 -> GOT에서 라이브러리 함수 주소를 읽어온 후 이 값을 베이스로 system 함수의 주소와 라이브러리 내부의 "/bin/sh" 문자열의 주소를 계산했다. 이를 통해 쉘을 띄움




mashed.zip


mashed.py




'System Hacking > CTF' 카테고리의 다른 글

CodeGate 2010 - yboy ( xbox pwned )  (0) 2015.08.21
DEFCON 2015 prequals - wwtw  (2) 2015.05.19
Plaid_CTF 2014 - ezhp  (0) 2015.05.15
CodeGate 2015 Quals - Sokoban  (1) 2015.05.15
Codegate 2015 - Bookstore  (2) 2015.03.21