tmxklab
[heap exploit] - House Of Force 본문
1. House Of Force
House Of XXX 시리즈 중 하나이며 힙 기반 취약점을 기반으로 사용된다.(Top Chunk를 이용)
사용조건 :
- Overflow 등을 통해 Top Chunk의 size를 제어할 수 있어야 한다.
- 공격자는 Malloc 요청의 크기를 제어할 수 있어야 한다.
House Of Force가 발생하는 이유는 glibc에서 malloc요청시 메모리 할당을 Top Chunk에서 처리해주기 때문이다.
만일, Top Chunk의 size를 악용하여 다른 값으로 덮어씌울 수 있고(보통 -1) 원하는 크기의 malloc요청을 할 수 있다면 공격자가 원하는 위치에 Top Chunk를 옮길 수 있다.
[할당 받기 원하는 주소] - [ Chunk Header size(0x10 or 0x8) ] - [ Top Chunk Address ] - [ Chunk Header size(0x10 or 0x8) ]
ex)
[ 0x602010 ] - [ 0x10 ] - [ 0x602040 ] - [ 0x10 ] = 0xffff ffff ffff ffb0(-80)
-> int *p1 = (int*)malloc(-80);
2. Example
2.1 예제 코드 - [ hof.c ]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(){
int *p1, *p2, *p3;
p1 = (int*)malloc(0x40);
fprintf(stderr, "p1 input :");
read(0, p1, 100);
fprintf(stderr, "p2 malloc Size : -96");
p2 = (int*)malloc(-96);
p3 = (int*)malloc(0x10);
read(0, p3, 16);
return 0;
}
2.2 Debugging
0) p1 = (int*)malloc(0x40)
-
현재 Top Chunk의 size는 0x20fb0이며 p1 Chunk가 Top Chunk바로 위에 위치해있다.
1) Heap Overflow
-
Top Chunk바로 위에 size가 0x50인 Chunk(p1)에서 입력 값을 넣은 상황
-
Overflow가 발생하여 Top Chunk의 size가 0xffff ffff ffff ffff로 변경
2) p2 = (int*)malloc(-96)
-
공격자가 원하는 주소가 0x90b010인 경우 다시 malloc을 요청할 떄
-
0x90b010 - 0x10 - 0x10 - 0x90b050 = 0xffff ffff ffff ffa0(-96)
-
따라서, malloc요청 시 -96만큼을 요청하면 원래 있던 Top Chunk의 자리에 size값 0xffff ffff ffff ffb0인 Chunk가 할당되고 Top Chunk의 위치는 0x90b000으로 변경된다.
3) p3 = (int*)malloc(0x10)
-
또 다시 이후에 malloc(0x10)을 요청하면 Top Chunk는 0x20만큼 할당해주고 다시 0x90b020으로 위치가 변경된다.
4) read(0, p3, 16)
-
p3에 입력 값을 받게되면 0x60b010부터 데이터가 저장된다.("BBBBBBBB")
-
이로써 Top Chunk의 size를 악용하여 원하는 주소인 0x90b010에 데이터를 쓸 수 있게된다.
3. References
'Security > 01 System Hacking' 카테고리의 다른 글
[heap exploit] - Unsorted bin Attack (0) | 2020.08.04 |
---|---|
[heap exploit] - Unsafe Unlink (4) | 2020.07.31 |
heap(4) - glibc malloc(3) (feat. bin) (3) | 2020.07.07 |
heap(3) - glibc malloc(2) (feat. chunk) (1) | 2020.07.07 |
heap(2) - glibc malloc(1) (feat. Arena) (0) | 2020.07.07 |