tmxklab

[heap exploit] - House Of Force 본문

Security/01 System Hacking

[heap exploit] - House Of Force

tmxk4221 2020. 7. 27. 11:43

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

Comments