해킹/Write Up

Hacklu 2014 oreo Write Up

NextLine 2017. 5. 3. 19:33

0. Introduce

정말 일주일은 잡은 문제인거같다.. 취약점은 찾았는데 공격할 수 있는 아이디가없어서 결국에는 라업을 검색해봤는데 라업도 많이없고 조금 다른내용을 다루는 라업이 대부분이라 풀기 너무 힘들었지만 결국에 메모리를 계속 보다가 찾아냈다.. 덕분에 house_of_spirit의 개념이나 이용에대해서 자세히 알게되었다.


1. Binary

32bit 바이너리에 카나리와 NX가 걸려있다. 사실 스택을 건드릴 일이 없어서 보호기법은 상관이 없다.


메뉴는 다음과 같다.

1) Add new rifle

- malloc 56byte

- malloc pointer + 25 지점부터 이름을 입력받음 (56byte)

- mllaoc pointer 지점부터 설명을 입력받음 (56byte)

- 이전 malloc pointer를 malloc pointer + 52부분에 넣음


2) Show added rifles

- malloc pointer + 52를 기준으로 현재 라이플과 이전 라이플들의 이름과 설명 출력


3) Order selected rifles

- malloc pointer + 52를 기준으로 현재 라이플과 이전 라이플 청크 전부 free


4) Leave a Message with your Order

- bss에있는 0x0804A2A8에 128바이트 입력받음.


5) Show current stats

- free한 횟수와 add한 횟수 그리고 leave a message안에 내용을 출력함.


6) Exit!

- return 으로 나감.


2. Vulnerability

- 라이플을 추가할 때 이름을 입력받는 부분을 보면 25지점부터 56바이트 입력받으므로 heap overflow가 발생한다.

- heap overflow가 발생해 malloc pointer + 52값을 수정할 수 있으므로 수정하고 2번메뉴로 원하는 모든 메모리에 값을 leak할 수 있다.


3. Exploit

( 변수 이름들은 임의로 설정함 )

메모리 주소를 알며, 자유롭게 입력할 수 있고, 그 메모리주소를 해제(free)할 수 있으면 house_of_spirit의 조건이 성립한다. 

이 바이너리에 경우 leave_msg_val에 86바이트를 자유롭게 쓸 수있다. 그러므로 house_of_spirit을 이용하면 leave_msg_val로 malloc할당을 할 수 있다. 하지만 그렇게 해도 할 수 있는것이 없다. 그래서 처음에는 got부분에 chunk크기가 될만한 메모리값들을 찾아보다가 결국 못찾고 계속 계속 보다가 new_count값을 확인하였다. 

new_count는 새롭게 라이플을 추가할때마다 값이 증가하는데, 이것을 현재 함수에서 할당하는 청크크기(0x38)만큼 증가하게 시키고 leave_msg_val 부분을 입력해서 조작된 청크의 다음청크가 있는것처럼 조작해준다. 그런 다음 heap overflow로 malloc pointer + 52를 new_count로 바꿔주고 free해주면 free가 성공적으로되서 다음 malloc을 할 때는 new_count + 0x4부분부터 쓸 수 있게된다.

그렇다면 leave_msg_val의 포인터를 put_got로 바꾸고 put_got를 leak한 libc_base를 기준으로 one_shot가젯을 찾아서 쉘을 획득했다.

실제 CTF에서 libc가 주어지지 않았더라도 libc의 특정주소 두개를 leak할 수 있으니 libc를 알아내서 one_shot가젯을 쓸 수 있을 것 이다. 뿐만 아니라 system_address를 got에 overwrite해서 풀 수도 있다.


 Full Exploit Code

(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2014_Hacklu%20Write%20Up/oreo.py)