...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
House of Lore
- House of Lore는 malloc()이 small bin에 해당하는 chunk의 재할당과 small bin에 배치하는 과정을 이용한 공격입니다.
malloc()은 small bin에 등록된 chunk를 사용하기 위해 메모리 할당을 요청한 크기가 small bin범위에 포함되는지 확인합니다.
요청된 크기가 small bin 범위에 포함된다면, 요청된 크기에 해당하는 index를 찾습니다.
그리고 bin[index]가 가지고 있는 값과 bin[index]→bk에 저장된 값을 비교합니다.
bin[index]→bk에 저장된 값을 victim에 저장합니다.
그리고 이 값이 0 인지 확인합니다.
victim에 저장된 값이 0 아니라면 victim→bk 에 저장된 값을 bck에 저장합니다.
그리고 bck->fd의 "victim"의 값이 다른지 확인합니다.
두 값이 같지 않다면 malloc()은 에러 메시지("malloc(): smallbin double linked list corrupted")를 출력되고 프로세스를 종료합니다.
두 값이 같다면 victim->size에 PREV_INUSE를 설정합니다.
그리고 bck가 가지고 있는 값을 bin→bk에 저장되고, bin이 가지고 있는 값을 bck→fd에 저장합니다.
해당 arena가 main arena인지 확인 합니다.
main arena가 아닐 경우 victim→size에 NON_MAIN_ARENA(0x4) flag를 설정합니다.
그리고 할당자는 chunk2mem()을 호출하여 반환할 주소(victim + 2*SIZE_SZ)를 *p에 저장하고, p를 반환합니다.
...
Panel | ||
---|---|---|
| ||
Example
- 이 코드는 앞에서 언급한 예와 동일한 코드입니다.
- 크기가 128 바이트, 256 바이트 인 메모리의 할당을 요청합니다.
- 크기가 128byte인 메모리의 해제를 요청한 후, 메모리 할당을 요청합니다.
- fake chunk를 stack에 작성하고 fake chunk의 포인터를 free chunk의 bk에 저장합니다.
- 그리고 크기가 128byte인 메모리 2개의 할당을 요청합니다.
...
Code Block | ||
---|---|---|
| ||
gdb-peda$ c Continuing. buf4 : 0x602010 buf5 : 0x7fffffffe2b0 buf5 : Breakpoint 5, 0x00000000004008ad in main () gdb-peda$ x/i $rip => 0x4008ad <main+439>: call 0x4005a0 <read@plt> gdb-peda$ i r rsi rsi 0x7fffffffe2b0 0x7fffffffe2b0 gdb-peda$ x/4gx 0x7fffffffe2b0 0x7fffffffe2b0: 0x00007ffff7dd1bf8 0x00007fffffffe2c0 0x7fffffffe2c0: 0x0000000000000000 0x0000000000000000 gdb-peda$ ni AAAAAAAAAAAAAAAA 0x00000000004008b2 in main () gdb-peda$ x/4gx 0x7fffffffe2b0 0x7fffffffe2b0: 0x4141414141414141 0x4141414141414141 0x7fffffffe2c0: 0x000000000000000a 0x0000000000000000 gdb-peda$ |
Related information
- https://github.com/shellphish/how2heap
- https://gbmaster.wordpress.com/2015/07/16/x86-exploitation-101-house-of-lore-people-and-traditions
...