RCTF 2017 RNote WriteUp
0. Introduce
fastbin_dup문제였고 익스방식은 babyheap보다 간단했습니다. 0ctf babyheap과 상당히 비슷해서 쉽게 풀 수 있었습니다. 그리고 실제 rctf도중에 푼 문제중 유일한 문제였는데 다른문제를 못풀어서 엄청 아쉽습니다.
1. Binary
보호기법이 거의 풀려있다.
-- Chunk List --
bss영역에 chunk의 정보를 저장하는데 형식은 다음과 같다.
[check(4byte)] + [size(4byte)] + [title(16byte)] + [chunk_add(8byte)]
check부분에는 해당 chunk가 free 됬으면 0, free되지 않았으면 1이 써진다.
1. Add new note
Add new note에서는 size, title, content를 각각 받아서 size만큼 malloc으로 할당해주고, 그 chunk의 data에 입력받은 size만큼 content를 넣어준다. 또한 title은 17byte를 Chunk list에 넣어주는데 17바이트인 이유는 아래 취약점설명부분에서 다시 언급할 예정이다. 마지막으로 check부분을 1로 만들어준다.
2. Delete a note
Chunk List를 기반으로 chunk_add를 free한뒤에 check를 0으로바꾼다.
3. Show a note
Chunk List를 기반으로 chunk_add에서 size만큼 출력한다.
2. Vulnerability
취약점은 title을 입력받을때 발생한다.
위 함수는 title을 입력받는 함수인데 부등식이 i <= size임을 알 수 있다. 그래서 실제 size보다 1byte를 더 입력받아서 title다음에 chunk size를 1바이트 원하는 값으로 overwrite할 수 있다. 이를 이용해 fastbin_dup를 발생시킬 수 있다.
3. Exploit
1) libc leak
libc leak은 uaf로 매우 간단히 발생한다. small bin에 들어갈만한 size의 chunk를 두개 할당하고 첫번째 chunk를 free한 뒤에 다시 할당하면 전 chunk의 fd와 bk를 leak할 수 있다. (unsorted bin에 들어갔을 때 fd, bk를 leak)
2) fastbin_dup
위에서 말했던 방식으로 fastbin_dup를 이용해서 malloc_hook 근처의 주소로 0x7f크기에 chunk를 가상으로 설정하고 이 위치로 malloc을 받아서 malloc_hook을 덮을 수 있다.
Full Exploit Code
* 실제 서버에서 첫번째 입력값이 제대로 들어가지 않아서 서버환경에 맞게 익스한것이기 때문에 s.sendline('1')을 처음에 넣은것은 무시해주시면 됩니다.
local exploit > (https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_Rctf%20Write%20Up/RNote.py)
FLAG