Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
2016년 8월 14일
How2Heap
Buffer overflow in heap
2
발표자 소개
 성균관대학교 2학년 재학 중
 성균관대학교 정보보호 동아리 HIT 회장
 Best of the Best 4기 취약점 분석트랙 수료
2016-08-
15
성균관대학교 H.I.T
3
목차
 What is Heap?
 Why Heap?
 Who Controls Heap?
 How2heap?
 정리
2016-08-
15
성균관대학교 H.I.T
4
What is Heap?
 힙 메모리란?
 프로그램에서 사용할 수 있는 자유 메모리. 프로그램 실행 시에 함수로 보
내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제
나 사용할 수 있는 대량의...
5
What is Heap?
 힙 메모리란?
성균관대학교 H.I.T
6
Why Heap?
성균관대학교 H.I.T
Stack Overflow는 점점 줄다가 2014년에 발견되지 않음.
2014년 80%가 넘는 취약점이 Heap 관련 취약점 ( UAF, Heap corruption )
7
Who Controls Heap?
Memory Allocator라고 불리는 프로그램이 힙 메모리를 관리함
각자 자신들만의 알고리즘을 가지고 최대한 좋은 memory allocator 를 구현
함.
 dlmalloc...
8
Who Controls Heap?
 생각보다 malloc은 처리해야 할 것들이 많음.
 단편화 (Fragmentation)
 Thread Safety
 성능 향상
- Byte Align 등등.
2016-08-...
9
Who Controls Heap?
Glibc2.23 , malloc.c 45th line (http://ftp.kaist.ac.kr/gnu/gnu/libc/)
2016-08-
15
성균관대학교 H.I.T
10
Who Controls Heap?
Malloc 에서 사용되는 자료 구조
Heap --- 큰 메모리 덩어리들을 지칭
Chunk --- 각각 malloc 된 조각들을 지칭
OS에서 Heap이라는 덩어리를 가져다 조금씩...
11
Malloc_chunk
성균관대학교 H.I.T
메모리를 요청한 크기보다
조금 크게 할당 됨
This Chunk Size
실제로 메모리 주소를
응용 프로그램에 줄 때는
User data 쪽을 돌려줌
12
Malloc 의 재사용성
a = malloc(512)
Free(a);
성균관대학교 H.I.T
13
Malloc 의 재사용성
b = malloc(500)
성균관대학교 H.I.T
14
Malloc 의 재사용성
b = malloc(500)
성균관대학교 H.I.T
15
Bins ( 126 개 )
 Free 된 것을 재사용 하기 위해서 모아두는 곳
비슷한 크기끼리 모아 번호를 붙여서 관리함
메모리 단편화를 막기 위해서 사용 됨
 Fast bin (exact fit)
 Unso...
16
Malloc_chunk
성균관대학교 H.I.T
원래 데이터가 있던 부분에
fd, bk 라는 내부 정보를 저장 해둠
나중에 다시 쓰기 위해서
링크드 리스트 형태로 저장함
17
Malloc_chunk
성균관대학교 H.I.T
This Chunk Size의 N , M , P
PREV_INUSE (P)
바로 이전 청크가 할당된 경우
IS_MMAPPED (M)
현재 청크가 mmap을 통해
할당된...
18
Malloc_chunk
성균관대학교 H.I.T
Prev_size:
바로 직전의 청크의 사이즈를 저장
( P = 0, 즉 이전 청크가 해제 되었을
때에만 유용함 )
19
Top Chunk?
Chunk Size
( 1000 )
User Data
(Top Chunk)
성균관대학교 H.I.T
malloc(22);
20
Top Chunk?
Chunk Size
( 1000 )
User Data
(Top Chunk)
Chunk Size
( 30 )
User Data
Chunk Size
( 970 )
User Data
(Top Chun...
21
Who Controls Heap?
malloc 동작 방식 요약
 1. free된 목록에 비슷한 크기가 있으면 그것을 응용 프로그램에게 줌
 2. 재사용 할 것이 없으면 Top 청크를 두 개로 나눠서 하나를 프로...
22
How2Heap?
 https://github.com/shellphish/how2heap
2016-08-
15
성균관대학교 H.I.T
23
How2Heap Contents
Git clone https://github.com/shellphish/how2heap
Cd how2heap && make
./house_of_force
성균관대학교 H.I.T
24
Heap Exploit Techniques.
 Use After Free
 Double free bug ( 막힘 )
 Fastbin_dup
 House of force
 House of spirit
 H...
25
 Fastbin_dup
a = 1000, b = 2000 일 때
목표 : malloc(8) 을 통해 123456XX번지 받기
Fastbin_dup
성균관대학교 H.I.T
26
Fastbin_dup
 원래 정상적인 방식
 free(a); free(b); free(c); free(d);
 malloc() , malloc(), malloc() , malloc()
 순서대로 d, c, ...
27
Fastbin_dup
 중복 FREE를 할 경우
 Free(a); free(b); free(a);
 Malloc() , malloc(), malloc()
 순서대로 a, b, a를 응용 프로그램에 할당
성균...
28
Fastbin_dup
 Fastbin_dup
 Free(a);
다음에 반환할 주소
A
Fd = null
1000
Size
Fd
Bk
Unused
Size
User
Data
성균관대학교 H.I.T
29
Fastbin_dup
 Fastbin_dup
 free(a); free(b);
B
Fd = 1000
2000
Size
Fd
Bk
Unused
Size
User
Data
A
Fd = null
성균관대학교 H.I.T
30
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
A
Fd = 2000
1000
Size
Fd
Bk
Unused
Size
User
Data
B
Fd = 1000
A
...
31
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
A
Fd = 2000
1000
Size
Fd
Bk
Unused
Size
User
Data
B
Fd = 1000
A
...
32
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
 int *c = malloc(8);
A
Fd = 2000
1000
Size
Fd
Bk
Unused
Size
Us...
33
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
 int *c = malloc(8); // 결과값 1000
2000
Size
Fd
Bk
Unused
Size
Us...
34
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
 int *c = malloc(8); // 결과값 1000
 *c = 0x12345678
2000
Size
Fd...
35
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
 int *c = malloc(8); // 결과값 1000
 *c = 0x12345678;
2000
Size
F...
36
Fastbin_dup
 Fastbin_dup
 free(a); free(b); free(a);
 int *c = malloc(8); // 결과값 1000
 *c = 0x12345678;
 Malloc(8)...
37
Fastbin_dup
 Fastbin_dup 정리
 A 도 1000번지, C 도 1000번지
 똑같은 위치를 A, C 두 개가 가리켜서 생김
 C에는 사용자의 데이터가, A에는 free list 관련 데이터...
38
House of force
 top chunk size 조작을 통해서 원하는 위치에 malloc을 할 수 있음
 힙에서의 Buffer Overflow 취약점이 선행 되어야 함.
char * string = ( ...
39
House of force
Chunk Size
( 1000 )
User Data
(Top Chunk)
성균관대학교 H.I.T
Malloc Size
1000 이하 :
Top 청크가 둘로 나뉨
1000 이상 :
새로운...
40
House of force
Chunk Size
( 1000 )
User Data
(Top Chunk)
Chunk Size
( 30 )
User Data
Chunk Size
( 970 )
User Data
(Top ...
41
House of force
Chunk Size
( 970 )
User Data
(Top Chunk)
Chunk Size
( 30 )
AAAAAAAAA
AAAAAAAAA
AAAAAAAAA
AAAAAAAAA
AAAAA...
42
House of force
Chunk Size
( 970 )
User Data
(Top Chunk)
Chunk Size
( 30 )
AAAAAAAAA
AAAAAAAAA
Chunk Size
( 41414141 )
U...
43
House of force
Chunk Size
( 40000000 )
User Data
Chunk Size
( 1414141 )
User Data
(Top Chunk)
Malloc(40000000);
성균관대학교 ...
44
House of force
Malloc(100);
Chunk Size
( 100 )
User Data
Chunk Size
( 1414041 )
User Data
(Top Chunk)
Chunk Size
( 4000...
45
House of force
Chunk Size
( 100 )
User Data
성균관대학교 H.I.T
 이렇게 만들어진 청크는 기존의 힙 보다 40000000만큼 떨어진 곳에 위치
 40000000을 조작하는 ...
46
House of force
 1. top chunk size 조작 ( 최대한 크게 )
 2. (다음에 할당 받고 싶은 주소 – 현재 Top chunk 주소) 만큼 새로 malloc
할당
 3. 다음 mallo...
47
Poison Null Byte
This Chunk Size의 N , M , P
PREV_INUSE (P)
바로 이전 청크가 할당된 경우
IS_MMAPPED (M)
현재 청크가 mmap을 통해
할당된 경우
NON_M...
48
Poison Null Byte
바로 직전의 청크의 사이즈를 저장
( P = 0, 즉 이전 청크가 해제 되었을
때에만 유용함 )
성균관대학교 H.I.T
49
Poison Null Byte
Prev | 101
User
Data
Line 2:
P = 0
Prev | 101
User
Data
Prev | 101
Fd
Bk
100 | 100
User
Data
Prev | 20...
50
Poison Null Byte
성균관대학교 H.I.T
 조건 :
널 바이트 하나 Overwrite와, malloc, free 를 원하는 대로 할 수 있어야 함.
 다른 취약점에 비해서는 요구 조건이 적고 발생할...
51
Poison Null Byte
성균관대학교 H.I.T
Prev | 0x41
A
Prev | 0x171
B
Prev | 0x101
C
A = malloc ( 0x38 ); // chunk size 0x40
B = m...
52
Poison Null Byte
성균관대학교 H.I.T
Prev | 41
A
Prev | 171
B
Prev | 101
C
free(B)
53
Poison Null Byte
성균관대학교 H.I.T
A[0x38] = 0;
/*
[0 ~ 0x37] 까지가 범위
Off by One Null Overwrite
Prev | 41
A
Prev | 171
B
free...
54
Poison Null Byte
성균관대학교 H.I.T
Size가 170 -> 100으로 줄어듬
D = malloc(0x38);
Prev | 100
B
freed
170 | 100
C
Prev | 41
A
55
Poison Null Byte
성균관대학교 H.I.T
Prev | C1
B
Freed
C0 | .
170 | 100
C
Chunk 의 사이즈가 줄어버려서
C의 Prev를 업데이트 하지 못함
E = malloc( 0...
56
Poison Null Byte
성균관대학교 H.I.T
Prev | 81
B
170 | 100
C
Free(D);
Prev | 41
D
Prev | 41
E
Prev | 41
A
57
Poison Null Byte
성균관대학교 H.I.T
Prev | 81
B
170 | 100
C
Free(C); << Merge
Prev | 41
D
40 | 41
E
Prev | 41
A
58
Poison Null Byte
성균관대학교 H.I.T
Prev | 81
B
170 | 100
C
F = Malloc(0x268);
Prev | 271
40 | 41
E
Prev | 41
A
59
Poison Null Byte
성균관대학교 H.I.T
Prev | 81
B
170 | 100
C
F = Malloc(0x268);
Prev | 271
F
Prev | 41
E
Prev | 41
A
60
Poison Null Byte
성균관대학교 H.I.T
 정리
 A, B, C 를 만들고, B를 해제
 A를 Overflow 해서 해제된 B의 사이즈를 줄여버림
 B를 쪼개서 D와 E를 만듬
 D를 Free...
61
총 정리
개발자 입장에서 (적어도 Heap에 대해 ) 안전한 프로그램 을 만드려면
1. Double-Free 와 같은 취약점을 발생시키지 않는 것.
2. Heap상에서 buffer overflow가 나지 않도록 관...
2016-08-15 동아리이름
63
Reference
 Exploitation Trends: From Potential Risk to Actual Risk –
RSAConference2015,
https://www.rsaconference.com/...
Upcoming SlideShare
Loading in …5
×

How2heap

1,694 views

Published on

2016 Inc0gnito Seminar
Heap Exploitation Explanation
fastbin_dup, house of force, poison null byte

Published in: Software
  • Login to see the comments

How2heap

  1. 1. 2016년 8월 14일 How2Heap Buffer overflow in heap
  2. 2. 2 발표자 소개  성균관대학교 2학년 재학 중  성균관대학교 정보보호 동아리 HIT 회장  Best of the Best 4기 취약점 분석트랙 수료 2016-08- 15 성균관대학교 H.I.T
  3. 3. 3 목차  What is Heap?  Why Heap?  Who Controls Heap?  How2heap?  정리 2016-08- 15 성균관대학교 H.I.T
  4. 4. 4 What is Heap?  힙 메모리란?  프로그램에서 사용할 수 있는 자유 메모리. 프로그램 실행 시에 함수로 보 내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제 나 사용할 수 있는 대량의 메모리가 있다. 이때, 소량의 메모리를 ‘스택’이 라 하고 대량의 메모리를 ‘힙’이라 한다. 네이버 용어사전 -http://terms.naver.com/entry.nhn?docId=863311&cid=50371&categoryId=50371  malloc을 통해 동적 할당한 메모리들. 성균관대학교 H.I.T
  5. 5. 5 What is Heap?  힙 메모리란? 성균관대학교 H.I.T
  6. 6. 6 Why Heap? 성균관대학교 H.I.T Stack Overflow는 점점 줄다가 2014년에 발견되지 않음. 2014년 80%가 넘는 취약점이 Heap 관련 취약점 ( UAF, Heap corruption )
  7. 7. 7 Who Controls Heap? Memory Allocator라고 불리는 프로그램이 힙 메모리를 관리함 각자 자신들만의 알고리즘을 가지고 최대한 좋은 memory allocator 를 구현 함.  dlmalloc – General purpose allocator  ptmalloc2 – glibc  Jemalloc – FreeBSD and Firefox  tcmalloc – Google  libumem – Solaris  MemGC – Edge Browser 2016-08- 15 성균관대학교 H.I.T
  8. 8. 8 Who Controls Heap?  생각보다 malloc은 처리해야 할 것들이 많음.  단편화 (Fragmentation)  Thread Safety  성능 향상 - Byte Align 등등. 2016-08- 15 성균관대학교 H.I.T
  9. 9. 9 Who Controls Heap? Glibc2.23 , malloc.c 45th line (http://ftp.kaist.ac.kr/gnu/gnu/libc/) 2016-08- 15 성균관대학교 H.I.T
  10. 10. 10 Who Controls Heap? Malloc 에서 사용되는 자료 구조 Heap --- 큰 메모리 덩어리들을 지칭 Chunk --- 각각 malloc 된 조각들을 지칭 OS에서 Heap이라는 덩어리를 가져다 조금씩 나눠주는 것을 구현한 코드 P.S ) 이해를 돕기 위해 앞으로 나오는 구조체는 실제 구현된 것과는 다를 수 있습니 다. 개념을 설명하는데 중점을 두었고, x86 기준 입니다. 2016-08- 15 성균관대학교 H.I.T
  11. 11. 11 Malloc_chunk 성균관대학교 H.I.T 메모리를 요청한 크기보다 조금 크게 할당 됨 This Chunk Size 실제로 메모리 주소를 응용 프로그램에 줄 때는 User data 쪽을 돌려줌
  12. 12. 12 Malloc 의 재사용성 a = malloc(512) Free(a); 성균관대학교 H.I.T
  13. 13. 13 Malloc 의 재사용성 b = malloc(500) 성균관대학교 H.I.T
  14. 14. 14 Malloc 의 재사용성 b = malloc(500) 성균관대학교 H.I.T
  15. 15. 15 Bins ( 126 개 )  Free 된 것을 재사용 하기 위해서 모아두는 곳 비슷한 크기끼리 모아 번호를 붙여서 관리함 메모리 단편화를 막기 위해서 사용 됨  Fast bin (exact fit)  Unsorted bin (Bin 1)  Small bin (Bin 2 to Bin 63, exact fit)  Large bin (Bin 64 to Bin 126) Free된 메모리 주소 성균관대학교 H.I.T
  16. 16. 16 Malloc_chunk 성균관대학교 H.I.T 원래 데이터가 있던 부분에 fd, bk 라는 내부 정보를 저장 해둠 나중에 다시 쓰기 위해서 링크드 리스트 형태로 저장함
  17. 17. 17 Malloc_chunk 성균관대학교 H.I.T This Chunk Size의 N , M , P PREV_INUSE (P) 바로 이전 청크가 할당된 경우 IS_MMAPPED (M) 현재 청크가 mmap을 통해 할당된 경우 NON_MAIN_ARENA (N)
  18. 18. 18 Malloc_chunk 성균관대학교 H.I.T Prev_size: 바로 직전의 청크의 사이즈를 저장 ( P = 0, 즉 이전 청크가 해제 되었을 때에만 유용함 )
  19. 19. 19 Top Chunk? Chunk Size ( 1000 ) User Data (Top Chunk) 성균관대학교 H.I.T malloc(22);
  20. 20. 20 Top Chunk? Chunk Size ( 1000 ) User Data (Top Chunk) Chunk Size ( 30 ) User Data Chunk Size ( 970 ) User Data (Top Chunk) 성균관대학교 H.I.T
  21. 21. 21 Who Controls Heap? malloc 동작 방식 요약  1. free된 목록에 비슷한 크기가 있으면 그것을 응용 프로그램에게 줌  2. 재사용 할 것이 없으면 Top 청크를 두 개로 나눠서 하나를 프로그램에 주고 나머지를 다시 Top 청크로 관리함. 성균관대학교 H.I.T
  22. 22. 22 How2Heap?  https://github.com/shellphish/how2heap 2016-08- 15 성균관대학교 H.I.T
  23. 23. 23 How2Heap Contents Git clone https://github.com/shellphish/how2heap Cd how2heap && make ./house_of_force 성균관대학교 H.I.T
  24. 24. 24 Heap Exploit Techniques.  Use After Free  Double free bug ( 막힘 )  Fastbin_dup  House of force  House of spirit  House of lore  Poison Null Byte  등등… 성균관대학교 H.I.T
  25. 25. 25  Fastbin_dup a = 1000, b = 2000 일 때 목표 : malloc(8) 을 통해 123456XX번지 받기 Fastbin_dup 성균관대학교 H.I.T
  26. 26. 26 Fastbin_dup  원래 정상적인 방식  free(a); free(b); free(c); free(d);  malloc() , malloc(), malloc() , malloc()  순서대로 d, c, b, a를 응용 프로그램에 할당 성균관대학교 H.I.T
  27. 27. 27 Fastbin_dup  중복 FREE를 할 경우  Free(a); free(b); free(a);  Malloc() , malloc(), malloc()  순서대로 a, b, a를 응용 프로그램에 할당 성균관대학교 H.I.T
  28. 28. 28 Fastbin_dup  Fastbin_dup  Free(a); 다음에 반환할 주소 A Fd = null 1000 Size Fd Bk Unused Size User Data 성균관대학교 H.I.T
  29. 29. 29 Fastbin_dup  Fastbin_dup  free(a); free(b); B Fd = 1000 2000 Size Fd Bk Unused Size User Data A Fd = null 성균관대학교 H.I.T
  30. 30. 30 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a); A Fd = 2000 1000 Size Fd Bk Unused Size User Data B Fd = 1000 A Fd = null 성균관대학교 H.I.T
  31. 31. 31 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a); A Fd = 2000 1000 Size Fd Bk Unused Size User Data B Fd = 1000 A Fd = 2000 성균관대학교 H.I.T
  32. 32. 32 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a);  int *c = malloc(8); A Fd = 2000 1000 Size Fd Bk Unused Size User Data B Fd = 1000 A Fd = 2000 성균관대학교 H.I.T
  33. 33. 33 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a);  int *c = malloc(8); // 결과값 1000 2000 Size Fd Bk Unused Size User Data B Fd = 1000 A Fd = 2000 성균관대학교 H.I.T
  34. 34. 34 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a);  int *c = malloc(8); // 결과값 1000  *c = 0x12345678 2000 Size Fd Bk Unused Size User Data B Fd = 1000 A , C Fd = 2000 성균관대학교 H.I.T
  35. 35. 35 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a);  int *c = malloc(8); // 결과값 1000  *c = 0x12345678; 2000 Size Fd Bk Unused Size User Data B Fd = 1000 A , C Fd = 12345678 성균관대학교 H.I.T
  36. 36. 36 Fastbin_dup  Fastbin_dup  free(a); free(b); free(a);  int *c = malloc(8); // 결과값 1000  *c = 0x12345678;  Malloc(8); // 2000  Malloc(8); // 1000  Malloc(8); // 12345678 2000 Size Fd Bk Unused Size User Data B Fd = 1000 A , C Fd = 12345678 성균관대학교 H.I.T
  37. 37. 37 Fastbin_dup  Fastbin_dup 정리  A 도 1000번지, C 도 1000번지  똑같은 위치를 A, C 두 개가 가리켜서 생김  C에는 사용자의 데이터가, A에는 free list 관련 데이터가 존재.  요구 조건 : 더블 프리가 일어 나야 함 ( a, b, a 처럼 하나 건너서 ) ( 12345678 번지에 있는 Size 영역을 맞춰줘야 함 ) ( 크기가 작은 청크들 에만 적용이 가능 함 ) Size Fd Bk Unused Size User Data 성균관대학교 H.I.T
  38. 38. 38 House of force  top chunk size 조작을 통해서 원하는 위치에 malloc을 할 수 있음  힙에서의 Buffer Overflow 취약점이 선행 되어야 함. char * string = ( char *) malloc( 10 ); strcpy( a, argv[1] );  Write – What – Where 가능 성균관대학교 H.I.T
  39. 39. 39 House of force Chunk Size ( 1000 ) User Data (Top Chunk) 성균관대학교 H.I.T Malloc Size 1000 이하 : Top 청크가 둘로 나뉨 1000 이상 : 새로운 메모리 덩어리를 OS에 요 청
  40. 40. 40 House of force Chunk Size ( 1000 ) User Data (Top Chunk) Chunk Size ( 30 ) User Data Chunk Size ( 970 ) User Data (Top Chunk) Malloc(22); 성균관대학교 H.I.T
  41. 41. 41 House of force Chunk Size ( 970 ) User Data (Top Chunk) Chunk Size ( 30 ) AAAAAAAAA AAAAAAAAA AAAAAAAAA AAAAAAAAA AAAAAAAAA Buffer Overflow 성균관대학교 H.I.T
  42. 42. 42 House of force Chunk Size ( 970 ) User Data (Top Chunk) Chunk Size ( 30 ) AAAAAAAAA AAAAAAAAA Chunk Size ( 41414141 ) User Data (Top Chunk) Buffer Overflow 성균관대학교 H.I.T Chunk Size ( 30 ) AAAAAAAAA AAAAAAAAA AAAAAAAAA AAAAAAAAA AAAAAAAAA
  43. 43. 43 House of force Chunk Size ( 40000000 ) User Data Chunk Size ( 1414141 ) User Data (Top Chunk) Malloc(40000000); 성균관대학교 H.I.T Chunk Size ( 41414141 ) User Data (Top Chunk) Chunk Size ( 30 ) User Data
  44. 44. 44 House of force Malloc(100); Chunk Size ( 100 ) User Data Chunk Size ( 1414041 ) User Data (Top Chunk) Chunk Size ( 40000000 ) User Data Chunk Size ( 1414141 ) User Data (Top Chunk) 성균관대학교 H.I.T
  45. 45. 45 House of force Chunk Size ( 100 ) User Data 성균관대학교 H.I.T  이렇게 만들어진 청크는 기존의 힙 보다 40000000만큼 떨어진 곳에 위치  40000000을 조작하는 것으로 원하는 위치에 malloc이 가능함 ※ realloc 등의 함수는 size_t 형태라서 음수를 넣을 경우 위의 조작이 가능함
  46. 46. 46 House of force  1. top chunk size 조작 ( 최대한 크게 )  2. (다음에 할당 받고 싶은 주소 – 현재 Top chunk 주소) 만큼 새로 malloc 할당  3. 다음 malloc을 통해서 할당된 메모리에 원하는 값 복사  요구 사항 현재 Top Chunk 주소를 알아내야 함. Buffer Overflow 버그로 Top Chunk Size를 수정할 수 있어야 함. 원하는 만큼 malloc 할 수 있어야 함 성균관대학교 H.I.T
  47. 47. 47 Poison Null Byte This Chunk Size의 N , M , P PREV_INUSE (P) 바로 이전 청크가 할당된 경우 IS_MMAPPED (M) 현재 청크가 mmap을 통해 할당된 경우 NON_MAIN_ARENA (N) 성균관대학교 H.I.T
  48. 48. 48 Poison Null Byte 바로 직전의 청크의 사이즈를 저장 ( P = 0, 즉 이전 청크가 해제 되었을 때에만 유용함 ) 성균관대학교 H.I.T
  49. 49. 49 Poison Null Byte Prev | 101 User Data Line 2: P = 0 Prev | 101 User Data Prev | 101 Fd Bk 100 | 100 User Data Prev | 201 Fd Bk 성균관대학교 H.I.T Line 3: Line 4: (Merged)
  50. 50. 50 Poison Null Byte 성균관대학교 H.I.T  조건 : 널 바이트 하나 Overwrite와, malloc, free 를 원하는 대로 할 수 있어야 함.  다른 취약점에 비해서는 요구 조건이 적고 발생할 수 있을 가능성이 높음 문자열의 끝을 처리하다가 00을 끝에 Overwrite 하는 등..  결과 : 두 개의 청크가 Overlapp 되는 것  A : 1000~2000번지 사용  B : 1500~1600번지 사용
  51. 51. 51 Poison Null Byte 성균관대학교 H.I.T Prev | 0x41 A Prev | 0x171 B Prev | 0x101 C A = malloc ( 0x38 ); // chunk size 0x40 B = malloc ( 0x168 ); // chunk size 0x170 C = malloc ( 0x98 ); // chunk size 0x100 ※ 한 청크의 Size Data + sizeof(Prev) + sizeof(Size)
  52. 52. 52 Poison Null Byte 성균관대학교 H.I.T Prev | 41 A Prev | 171 B Prev | 101 C free(B)
  53. 53. 53 Poison Null Byte 성균관대학교 H.I.T A[0x38] = 0; /* [0 ~ 0x37] 까지가 범위 Off by One Null Overwrite Prev | 41 A Prev | 171 B freed 170 | 100 C
  54. 54. 54 Poison Null Byte 성균관대학교 H.I.T Size가 170 -> 100으로 줄어듬 D = malloc(0x38); Prev | 100 B freed 170 | 100 C Prev | 41 A
  55. 55. 55 Poison Null Byte 성균관대학교 H.I.T Prev | C1 B Freed C0 | . 170 | 100 C Chunk 의 사이즈가 줄어버려서 C의 Prev를 업데이트 하지 못함 E = malloc( 0x38 ); Prev | 41 D Prev | 41 A
  56. 56. 56 Poison Null Byte 성균관대학교 H.I.T Prev | 81 B 170 | 100 C Free(D); Prev | 41 D Prev | 41 E Prev | 41 A
  57. 57. 57 Poison Null Byte 성균관대학교 H.I.T Prev | 81 B 170 | 100 C Free(C); << Merge Prev | 41 D 40 | 41 E Prev | 41 A
  58. 58. 58 Poison Null Byte 성균관대학교 H.I.T Prev | 81 B 170 | 100 C F = Malloc(0x268); Prev | 271 40 | 41 E Prev | 41 A
  59. 59. 59 Poison Null Byte 성균관대학교 H.I.T Prev | 81 B 170 | 100 C F = Malloc(0x268); Prev | 271 F Prev | 41 E Prev | 41 A
  60. 60. 60 Poison Null Byte 성균관대학교 H.I.T  정리  A, B, C 를 만들고, B를 해제  A를 Overflow 해서 해제된 B의 사이즈를 줄여버림  B를 쪼개서 D와 E를 만듬  D를 Free ( E 만 중간에 할당 되어 있음 )  C를 Free 하면서 맨 처음의 B~C를 합병하게 됨 >> Overlap
  61. 61. 61 총 정리 개발자 입장에서 (적어도 Heap에 대해 ) 안전한 프로그램 을 만드려면 1. Double-Free 와 같은 취약점을 발생시키지 않는 것. 2. Heap상에서 buffer overflow가 나지 않도록 관리하는 것. 널 바이트 하나도 허용 해서는 안 된다. 공격자 입장에서 Heap을 Exploit 하려면 1. 위에 언급한 취약점을 찾을 수 있어야 하고 ( 널 바이트 하나라도 소중 히! ) 2. Heap 근처에 위치한 자료구조에 대해서 잘 알고 있어야 합니다. 성균관대학교 H.I.T
  62. 62. 2016-08-15 동아리이름
  63. 63. 63 Reference  Exploitation Trends: From Potential Risk to Actual Risk – RSAConference2015, https://www.rsaconference.com/writable/presentations/file_upload/br-t07- exploitation-trends-from-potential-risk-to-actual-risk.pdf  Understanding glibc malloc https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/  Understanding Heap by breaking it https://www.blackhat.com/presentations/bh-usa- 07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf  Slideshare – AngelBoy, Heap Exploitation http://www.slideshare.net/AngelBoy1?utm_campaign=profiletracking&ut m_medium=sssite&utm_source=ssslideview 2016-08- 15 성균관대학교 H.I.T

×