House of Spirit
House of 시리즈중 하나로 Free함수의 인자를 조작해 원하는 주소에 Overwrite가
가능하도록 만드는 공격기법으로 공격조건은 다음과 같습니다.
공격 조건
1. free 함수의 인자를 조작할 수 있어야 할 것
2. Overwrite 하고자 하는 타겟의 주소를 알아야 할 것
3. 해당 영역에 값을 쓸수 있어야 할 것(Overwrtie를 하기 위한 부분)
해당 공격기법을 이해하기 위해서는 배경지식이 필요한데
이전에 정리한 IO_File 정리에서 fastbin, tcache등을 정리한내용을 기반으로
정리하였습니다.
https://skysquirrel.tistory.com/268
[Linux] Linux File System _IO_FILE
드림핵 로드맵을 진행하면서 이해하는데 어려운부분이 있어 공부하며 정리하는 글로 아래 자료를 참고하여 정리하였습니다. (공부중인 내용이므로 다르거나 틀린 내용이 있을 시 댓글로 알려
skysquirrel.tistory.com
공격기법의 흐름은 먼저 스택에 가짜 청크 헤더를 구성합니다.

구성된 스택주소 + 가짜 헤더 사이즈(0x10) 주소를 free함수의 인자로 넣어주면
free함수는 가짜로 만들어진 헤더 구조를 보고 스택을 청크로 인식하여 tcache에 해당영역을 저장하게 됩니다.

이렇게 저장된 tcache에서 가짜 청크 헤더를 구축할때 지정한 청크사이즈를 요청하게 되면
malloc의 구조상 tcache의 청크를 그대로 가져오게 되고 이는 해당영역을
Overwrite할수 있게됩니다.
How2heap
디버깅을 통해 보기 위해 How2heap의 house of spirit 예제 코드를 가져왔습니다.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
setbuf(stdout, NULL);
malloc(1);
unsigned long long *a; //pointer that will be overwritten
unsigned long long fake_chunks[10]; //fake chunk region
fake_chunks[1] = 0x40; // this is the size
a = &fake_chunks[2];
free(a);
void *b = malloc(0x30);
printf("malloc(0x30): %p\n", b);
assert((long)b == (long)&fake_chunks[2]);
}
위 코드는 fake_chunks라는 배열이 스택부분에 해당하는데
첫번째 인덱스에는 가짜 청크 헤더를 넣고
두번째 인덱스를 인자로 free하는 것으로
*b에 malloc으로 힙을 할당했을때 저장된 스택 영역을 사용하는지 확인하는 코드입니다.
fake_chunks를 free하는 부분을 gdb로 보면

free함수의 인자값으로는 배열을 넣었는데
청크를 해제한것과 동일하게 tcache_entry에 해당 값이 저장되어 있는 것을 확인 할 수 있습니다.
그리고 *b에서 다시 malloc 요청을 하면서 할당되는 영역을 보면

tcache에 저장되어 있던 영역이 그대로 RAX에 전달되어 할당되고
해당 주소는 stack에서도 같은 주소를 확인하면서 동일한 영역을 사용중인 것을 확인 할 수 있습니다.
이러한 구조에 따라 할당한 영역에 값을 입력받게 되면서
값을 Overwrite하는 공격으로 이어질 수 있게 되는 것입니다.
간단한 예시코드가 아닌 Exploit 하는 내용은 워게임 문제가 남아있어
워게임 문제에서 다루도록 하고 여기서 정리를 마칩니다.
Reference
1. https://learn.dreamhack.io/16#p668
2. https://www.lazenca.net/pages/viewpage.action?pageId=1148022
3. https://j4guar.tistory.com/55
4. https://github.com/shellphish/how2heap
'Reference > Pwnable_Study' 카테고리의 다른 글
[Pwn] Docker파일 주어진 경우 Heap 분석 환경셋팅 (0) | 2024.03.18 |
---|---|
[Pwn] House of Force (2) | 2024.01.10 |
[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 |