해킹/Write Up

RCTF 2017 RNote2 WriteUp

NextLine 2017. 5. 28. 15:23

0. Introduce

정말 힘들게 푼 문제입니다. 처음에 바이너리를 분석해보고 바이너리 내부에서 unlink코드가 있는걸보고 생각을 처음부터 unlink라고 생각하고 풀어서 힘들었습니다. 그래도 문제를 풀면서 file stream을 overwrite하여 원하는 함수를 실행시키는 법을 알았고 생각보다 얻은게 많았던 문제입니다.


알게된점

1) file stream overwrite을 할시에는 실제 함수가 실행되는 부분을 잘 확인해야한다. 특히 puts함수에는 인자때문에 execve에 3번째 인자가 0이 될 수가 없어서 hook부분을 one_shot gadget으로 overwrite했을때 실패할 가능성이 매우크다.

2) 저번에 pwnable tw문제중 dubllesort를 풀 때 내가 만들어서 사용했던 기법으로 모든 unlink문제를 풀 수 있을꺼라 생각했으나 일단 unlink를 진행하려면 malloc과 free를 동시에 진행해야 해서 불가능하며 만약에라도 하려면 전부 malloc을 해놓고 8개의 fd와 bk를 전부 수정하고 전부 free하는 식으로 공격해야하기때문에 매우 힘드므로 그렇게 효율적인 방법은 아닌것 같다.


1. binary

전부 걸려있으며 다른문제와 비슷하게 역시 PIE빼고는 딱히 걸리는건 없다. 아직 PIE가 걸려있는 문제를 풀때 익스가 느려지는건 어쩔수없는것같다.



1. Add new note

size가 256이 아니면 chunk의 정보를 담고있는 chunk(0x28)하나와 내용을담는 chunk를 선언한다.


2. Delete a note

자체적으로 unlink를 진행하며 info_chunk와 내용을 담는 chunk를 free한다.


3. List all note

info_chunk를 기준으로 모든 chunk의 정보/데이터를 출력한다.


4. Edit a note

chunk_info를 기준으로 size만큼 data에 넣는다.


5. Expand a note

입력한 size에 target_chunk의 size를 더해서 그만큼 realloc해주고 strncat으로 data를 합친다.


- Expand a note & Edit a note

Expand와 Edit을 할 때 info_chunk의 가장 첫번째 값을 검사해서 이미 Expand했거나 Edit했던적이 있으면 프로그램을 종료해버린다. 즉 Expand와 Edit은 한번씩만 사용가능하다.


2. Vulnerability

1) 위 사진처럼 uaf를 이용하여(A와 B의 개수는 상관없음) 원래 size보다 더 많은 데이터를 넣을 수 있다. 그리고 expend를 하면 strncat에서 *(target_chunk + 4) 와 input_data를 합치는데 *(target_chunk+4)의 크기는 검사하지 않으므로 15byte heap overflow가 발생한다. 

2) 또한 항상 그러듯이 free한 small bin size에 chunk에서 main_arena의 주소가 노출되므로 libc_leak이 가능하다.


3. Exploit

baby heap을 풀었을때와 비슷하게 haep_chunk의 size를 더 크게 조작하고 free한 다음 다시 malloc하여 overlapping chunk를 발생시킬 수 있다. babyheap과 방법자체는 비슷한데 익스방법이 좀 더 힘들다.


그후에는 eip를 바꿀 방법이 두가지있다.

1. custom으로 unlink를 하므로 fd와 bk를 조작하여 원하는 위치에 값을 쓸 수 있음. 

-> malloc/free/realloc hook overwrite 불가 & puts("Done!") 때문에 _IO_file_jumps pointer overwrite이 oneshot가젯으로 쉘이 안따임.


2. fast_bin_dup를 이용하여 원하는 위치에 malloc 할당 가능

-> malloc_hook근처에 있는 주소값을 이용하여 fake_chunk 구성 후 할당받아서 malloc_hook overwrite.


그래서 2번방법으로 쉘 획득에 성공하였다.


Full Exploit Code

(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_Rctf%20Write%20Up/RNote2.py)