...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
House of einherjar
- House of einherjar는 _int_free()가 chunk를 top chunk에 등록하는 과정을 악용하는 기법입니다.
_int_free()은 전달받은 포인터가 fastbin에 포함되는 chunk인지 확인합니다.
그리고 해당 chunk가 fastbin이 아닌 경우 해당 chunk가 mmap()으로 얻은 chunk인지 확인합니다.
- 그리고 해당 chunk가 mmap()으로 얻은 청크가 아닌 경우 Arena가 잠겨있는지 확인합니다.
- Arena가 잠겨있지 않다면 잠금을 설정합니다.
- _int_free()는 전달 받은 포인터와 arena의 top이 가지고 있는 값이 같은지 확인합니다.
- 그런 다음 다음 청크가 경기장의 경계를 벗어 났는지 여부와 다음 chunk가 실제로 사용되지 않는지 확인합니다.
- 그리고 chunk의 크기가 최소한의 크기보다 작은지, 그리고 Arena의 system_mem의 값보다 큰지 확인합니다.
- 이를 통해 다음 chunk의 크기가 정상인지 확인합니다.
_int_free()는 해당 chunk의 size에 PREV_INUSE flag가 설정되어 있는지 확인합니다.
- 해당 flag의 bit가 설정되어 있다면, 해당 chunk의 size와 prev_size를 더한 값을 size변수에 저장합니다.
- 그리고 chunk_at_offset()를 호출해서 해당 chunk의 포인터에서 prev_size를 뺀 포인터를 반환하며, 해당 포인터는 변수 p에 저장됩니다.
- 그리고 unlink()를 호출해서 해당 chunk를 빈 목록에서 제거합니다.
- 그리고 _int_free()는 다음 chunk가 top chunk인지 확인합니다.
- 만약 다음 chunk가 top chunk일 경우 다음 chunk의 크기를 size 변수에 더합니다.
- 해당 변수가 가지고 있는 값에 PREV_INUSE flag를 설정합니다.
- 그리고 변수 size와 변수 p를 set_head()에 전달하여 chunk의 헤더를 설정합니다.
- 그리고 Arena의 top에 변수 p를 저장합니다.
...
Panel | ||
---|---|---|
| ||
Example
- 해당 코드는 앞에서 예로 설명한 코드입니다.
- Stack에 가짜 덩어리를 만들고, 크기가 0x70, 0xf0인 메모리의 할당을 malloc()에 요청합니다.
- 마지막에 할당받은 chunk의 헤더의 값을 변경하고, 해당 chunk를 해제합니다.
- 새로운 메모리 할당을 요청하고, 해당 영역에 데이터를 저장합니다.
...
Code Block | ||
---|---|---|
| ||
gdb-peda$ ni 0x00000000004007b1 in main () gdb-peda$ x/i $rip => 0x4007b1 <main+267>: call 0x400590 <malloc@plt> gdb-peda$ ni 0x00000000004007b6 in main () gdb-peda$ i r rax rax 0x7fffffffe440 0x7fffffffe440 gdb-peda$ x/4gx 0x7fffffffe440 0x7fffffffe440: 0x00007fffffffe430 0x00007fffffffe430 0x7fffffffe450: 0x00007fffffffe430 0x00007fffffffe430 gdb-peda$ c Continuing. Breakpoint 2, 0x00000000004007cb in main () gdb-peda$ x/i $rip => 0x4007cb <main+293>: call 0x400560 <read@plt> gdb-peda$ i r rsi rsi 0x7fffffffe440 0x7fffffffe440 gdb-peda$ ni AAAAAAAAAAAAAAAA 0x00000000004007d0 in main () gdb-peda$ x/4gx 0x7fffffffe440 0x7fffffffe440: 0x4141414141414141 0x4141414141414141 0x7fffffffe450: 0x00007fffffffe40a 0x00007fffffffe430 gdb-peda$ |
Related information
...