House of Force
House of 시리즈중 하나로 힙기반의 Top Chunk를 활용하는 취약점 공격기법이다.
Top Chunk는 Heap의 청크 구조에서 힙영역의 가장 마지막에 위치하는 Chunk로
Chunk할당 요청이 들어왔을때 재사용이 가능한 Chunk가 없는 경우 Top Chunk를 쪼개서
사용할 수 있도록 Chunk영역을 반환해주는 역할을 한다.
Top Chunk는 일반적으로 0x21000만큼이 할당되어있는데
할당된 사이즈이상의 할당요청은 불가능한것이 기본이다.
그리고 Top Chunk는 Chunk를 쪼개서 사용할수 있게 반환하는 만큼
Free를 통해 해제된 Chunk가 Top Chunk와 인접하게 되면 Top Chunk는 이를 병합한다.

(0x48요청이 들어왔을때 헤더까지 해서 Top Chunk의 영역이 줄어든다.)
Houce Of Force는 Top Chunk의 Size부분을 조작할 수 있을 때
Top Chunk Size를 조작하여 원하는 주소의 위치로 Top Chunk를 옮겨
malloc 요청을 통해 공격자가 원하는 주소의 영역을 할당받아
Overwrite 하는 공격기법이다.
공격 조건
1. Top Chunk의 Size를 원하는 값으로 제어할 수 있을 것
2. Malloc 요청의 크기를 제어할 수 있을 것
공격 구조
원하는 주소에 할당하기 위해서는 다음과 같은 구조로 할당 받을 주소를 계산합니다.
[할당 받으려는 주소] - [ Chunk Header size(64bit 0x10, 32bit 0x8) ] - [ Top Chunk address ] - [ Chunk Header size(64bit 0x10, 32bit 0x8) ]
ex)
[ 0x602010 ] - [ 0x10 ] - [ 0x602040 ] - [ 0x10 ] = 0xffff ffff ffff ffb0(-80)
int *p1 = (int*)malloc(-80);
위와 같이 계산하는 이유는 아래 코드를 보면 알 수 있다.
아래의 코드는 glibc-2.27의 malloc 함수중 일부로

코드를 보면 chunk_at_offset 함수를 통해 탑청크 주소 p를 요청 크기 nb만큼 더해 이동시키고
해당 값을 remainder를 이용해 탑 청크의 주소로 갱신시키고 있다.
이로 인해 반환 주소는
Top Chunk 주소 + 요청크기 + 청크 헤더 사이즈 구조가 되기 때문에
원하는 주소의 값을 Overwrite 하기 위해서는 이를 역으로 계산해 주소를 계산하는 과정이 필요하다.
이렇게 계산된 값으로 malloc을 요청하게 되면 원하는 주소를 할당받는 것이 가능하고
값을 Overwrite 할 수 있다.
Example
위의 내용을 기반으로 Chunk가 만들어지면서 Top Chunk가 변경되는 것을 GDB로 보면 다음과 같다.
먼저 10만큼의 청크를 생성하면서 내부에 데이터를 aaaa 더미값으로 넣게되면


할당된 청크와 함께 Top Chunk를 확인할 수 있는데
할당된 청크의 주소를 기준으로 확인해보면
(사이즈를 10[0xA]으로 지정했지만 청크구조상 헤더추가로 size는 0x11 [32bit환경])

Top Chunk의 헤더 위에 할당된 청크가 생성되어 있는 것을 확인해 볼 수 있다.
즉, 위에서 설명한 공격조건을 만족하여 더미로 입력한 AAAA값들이
Top Chunk의 size를 의미하는 헤더 값을 오염시킨다면 다음과 같이 Top Chunk의 Size를 조작하는 것이 가능하다.

위처럼 기존 0x20ff1이였던 Top Chunk의 사이즈를 표현할 수 있는 최대치로 값을 조작하면
공격자는 원하는 주소, 타겟 주소(ex. 전역변수, 다른 함수)가 어디에 위치해 있든지 타겟주소와 Top Chunk까지의 offset을 계산해 해당 사이즈만큼을 더미 청크를 할당시켜 타겟 주소에 할당될 청크를 위치 시킬수 있게된다.
GDB를 통해 Top Chunk를 확인하기 위해 예시로 가져온 문제처럼
대부분은 malloc 할당과 할당된 청크에 들어갈 Data 값을 사용자에게 입력받는다.
이러한 흐름상 공격자가 원하는 주소를 타겟하여 할당할 수 있게 되면
코드흐름에 따라 Data를 입력받게 되고 타겟 주소의 값을 Overwrite하여 공격으로 이어지게 되는 것이다.
쉘을 탈취하는 내용은 실습 문제를 통해 진행할 예정이므로 해당글에서는 여기서 마무리한다.
Reference
1. https://learn.dreamhack.io/16#p645
2. https://rninche01.tistory.com/entry/heap-exploit-House-Of-Force
'Reference > Pwnable_Study' 카테고리의 다른 글
[Pwn] Docker파일 주어진 경우 Heap 분석 환경셋팅 (0) | 2024.03.18 |
---|---|
[Pwn] House of spirit (0) | 2024.01.19 |
[Pwn] _IO_FILE Arbitrary Write (0) | 2023.07.24 |
[Pwn] _IO_FILE Arbitrary Read (0) | 2023.07.03 |
[Pwn] _IO_FILE_Plus & _IO_FILE vtable Overwrite (0) | 2023.07.01 |