RCTF 2017 aiRcraft Write Up
0. introduce
Rctf포너블 문제는 확실히 재미있습니다. Rnote나 Rcalc도 재미있었고 SSG CTF풀면서도 문제가 재미있다고 느꼈는데 어떻게 이런문제들을 만드는지 만드는 사람은 정말 대단하다고 느낍니다. 푸는속도가 나아졌는지는 모르겠지만 그래도 평소보다는 덜 삽질해서 푼거같아 좋습니다. 누군가 heap관련에서 연습문제를 풀고싶다하면 aiRcraft와 Rnote, Rnote2를 정말 추천하고 싶습니다.
1. Binary
PIE가 걸려있으면 디버깅을 어떻게 빠르게할까 생각하던도중에 모니터를 하나 사서 더블모니터로 해보니까 어느정도 효과가 있는것같다. 나머지 보호기법은 딱히 익스에 영향을 안준다.
1. Buy a new plane
- 4가지 종류의 비행기를 구입할 수 있으며 이름을 입력받는다. (malloc(0x48))
- 구조체는 namepointer[0x8] -> name[0x20] + company_add[0x8] + airport_add[0x8] + bk[0x8] + fd[0x8] + free_function[0x8] 이다.
2. Build a new airport
- 이름과 크기를 입력받으며 공항을 구매한다. (malloc(0x88))
- 구조체는 namepointer[0x8] -> (name[가변]) + 포함된 비행기 pointer [0x8] ...(가변) 이다.
3. Enter a airport
- 공항의 순서를 입력하여 비행기 리스트를 확인하거나 공항과 포함된 비행기를 모두 free할 수 있다. (free과정에서 unlink가 발생한다)
4. Select a plane
- 원하는 공항에 소속되게 하거나 선택된 비행기를 free시킬 수 있다. 여기서는 선택된 비행기를 free시킬 때 plane에 있는 구조체에 free주소를 실행시켜서 free한다.
2. Vulnerability
- 비행기를 구입하고 free한다음에 airport의 name을 0x50 bin에 들어갈 수 있는 크기로 지정하면 uaf로 인해 memory leak을 할 수 있다.(pie_base)
- 공항에 비행기를 포함시킬때 중복을 검사하는 구문이 없기때문에 중복되게 등록하여 fast_bin_dup를 발생시킬 수 있다.
3. Exploit
fastbin_dup 익스에 pie까지 걸려있으므로 까다롭다.
1) pie_base leak
위에 취약점에 설명했는데 비행기는 0x48이므로 airport name을 0x40만큼 선언하면 free_function주소를 leak할 수 있다.
2) libc_base leak & heap leak
둘다 한가지방법으로 leak이 가능한데 먼저 fastbin_dup가 선행되어야 한다. fastbin_dup로 plane의 데이터를 각각 free_got와 bss에 있는 airport_list의 주소를 주면 위 함수에서 company를 출력할 때 둘다 leak할 수 있다.
3) exploit
fastbin_dup를 통해 검색이 가능한 chunk를 재할당해주고 airport의 name을 입력받는것으로 plane구조체의 free_add를 oneshot gadget으로 덮어서 풀었다.
이렇게 정리해놓으면 쉬운데 fastbin_dup를 한번하는게 아니라 leak과 ex에서 총 3번사용해야하고 unlink가 있어서 plane 검색하는 포인터가 망가져버리면 검색하기도 힘들고 까다롭다. 포인터가 꼬여버리는경우가 있어서 위 풀이보다 좋은 풀이가 생각나도 직접 메모리를 다루면 할 수 없었다.
Full Exploit - 소스가길어서 화질이 나쁘니 깃허브에서 보세요
(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_Rctf%20Write%20Up/aiRcraft.py)