overlapping chunk 두번째 자료이다.

이 자료 또한 어떠한 문서를 참조했다고 나와있었다.



(참조 문서)


그렇기에 나 또한 이 참조 문서 먼저 공부하였다.
이 문서에는 Heap overlapping에 관해서 3가지 정도의 방법을 제시했다.
Heap Overlapping에 관해 조금씩 다른 방법들을 제시했는데,
다들 비슷비슷한 느낌이었다. 그래도 많은 방법들을 봐두는 것이 좋은 것 같다.

지금까지 Heap Overlapping에 관련된 공격들을 정리하면서 깨달은 점이 있다.
그건
전부 Chunk 구조체의 SIZE 필드를 조작하므로써 공격을 한다는 것이었다.
PREV_SIZE라 던가, SIZE 필드라던가 chunk의 사이즈를 Allocator에게 솎여서 잘못된 할당과 해제를 유발하므로써 기존에 있던 chunk에 중첩되는 chunk를 만들게 하는 방식이었다.

그렇기에 최신 glibc에서는 PREV_SIZE 체크 라던가 SIZE 체크 부분이 추가되었고
이 부분을 우회하는 것을 최근 how2heap에서 본 기억이 난다.

무튼,

heap overlapping 2번째 분석을 시작하자!



(5개의 힙)


5개의 힙 영역을 할당한다.
malloc 사이즈는 1000으로 16진수로는 3E8이다.

뒷자리가 8인 것을 보면 눈치 채겠지만, off-by-one에 취약할 것이다.



(각 힙영역의 범위)


각 힙영역을 표시하기 위해 해당 영역에 문자들을 넣어주었다.



(문자 입력)


그 후 p4 영역을 free해준다.
왜 굳이 p4일까?
-> p4를 free해주면 top청크와 병합되지 않는다. 이유는 top청크와 인접한 p5가 존재하기 때문에 병합되지 않는다. 그리고 공격의 개략적인 시나리오를 말하자면 p1 청크에서 off-by-one으로 p2의 청크 사이즈를 조작할 것이고, p3의 영역을 포함하고 있는 중첩된 heap영역을 할당받는 것이 우리의 목적이다.

: 그렇기에 p4를 free해준 것이다.



(free)


p4를 free해준 후

p1을 이용해 p2의 청크 사이즈를 조작한다.



(청크 사이즈 조작)


조작한 사이즈는
p2 청크의 사이즈 + p3 청크의 사이즈 + PREV_IN_USE + sizeof(size_t)
조작할 사이즈는 p2와 p3를 합한 청크 사이즈로 만들 것이다.
뒤에 prev_in_use 값은 0x1 로써, 이전 청크가 사용중이라는 것을 알려주기 위해 설정한다. 그렇지 않으면 이전 청크와의 병합도 시도할 것이다.
sizeof 값이 더해지는 이유는 p2, p3의 헤더 크기를 추가해주는 것이다. 




(p2 free)


그 후 p2를 free해준다.
그렇게 되면 다음과 같은 일이 일어난다.
1. allocator는 p2를 free하려고 한다.
2. p2의 PREV_IN_USE 비트를 보니 이전 청크를 사용하는 군!
3. next chunk를 검사한다. (p2 주소 + p2의 사이즈 = p4) = next chunk는 p4
=> 왜 다음 청크가 p3이 아닌지? 방금 우리는 p2의 사이즈를 p2,p3을 합한 덩어리로 조작했다. 그렇기에 p2 주소 + (조작된)p2의 사이즈 = p4의 주소 이고 p4가 next chunk가 된다.
4. p4(next chunk)를 확인해보니, free 되어있네???
5. p4랑 병합해야지~, p2는 결론적으로 p2,p3,p4를 포함한 커다란 free chunk가 되버린다.

그 후 malloc을 통해 p3을 포함할만큼 커다란 영역을 할당받는다면?



(큰 영역 할당)


그렇게 되면 p3영역이 포함된 영역을 할당해준다.



(할당된 영역)


할당 된 영역을 보면 p6 사이에 p3영역이 들어있는 것을 확인 할 수 있다.

현재 p3에 들어있는 데이터



(p3의 데이터)


그 후 p6을 F로 1500 글자 채워준다.



(F로 채우기)


그렇게 되면 500자가 p3영역을 침범하게 되어 p3 데이터 앞부분이 F로 채워지게 된다.



(확인)


확인을 통해 p3가 중첩된 영역을 할당받은 것을 확인 할 수 있다.

'Vulnerability_Tech > About Heap' 카테고리의 다른 글

(how2heap) - overlapping_chunks  (0) 2018.02.22
(how2heap) - house of lore  (0) 2018.02.21
(how2heap) - poison null byte  (0) 2018.02.20
malloc의 사용가능 영역(HEAP)  (0) 2018.02.20
(how2heap) - house_of_spirit  (0) 2018.01.17
  오늘 분석한 자료는 overlapping chunks이다.
이 방법은 The Forgotten Chunks 라는 문서에서 가져왔다고 하여

해당 문서를 먼저 읽어보았다.



(참고 문서)


저 페이퍼는 정말 재밌었다.
작명센스도.! 잊혀진 청크..!

전략을 간략히 말하자면
heap overflow를 통하여 청크의 SIZE 필드를 조작한다.
그리하여 malloc 혹은 free를 통하여 중첩된 영역을 얻는다.

* 중첩된 영역을 얻는다 라는 것에 대해서
-> 예를들어 A라는 malloc 영역이 주소 4~8 이라고 하자.
그리고 B에 malloc을 받는데 0~11의 주소로 할당을 받는다고 한다면?
B 주소 영역에 A의 주소 영역이 포함되어있다. 그렇기에 B에 작성하므로 A영역의 데이터를 건들일 수 도 있고, A에 작성하므로써 B영역의 데이터를 건들일 수 도 있는 상황이 된다.

우리는 중첩된 영역을 얻는 것을 목표로 할 것이다.

먼저 3개의 malloc 주소를 할당받는다.


(malloc)


이 때 보면 malloc의 사이즈가 조금 의도된 듯한 느낌이 든다.
바로 -8 을 해준 이유는 사용 가능한 영역까지 꽉 할당받기 위해서이다.

포스트 글 malloc의 사용가능 영역
에 정리해 둔것을 참고하면 좋다.
https://blog.naver.com/rlagkstn1426/221212549437

실제의 상황에 위와같이 할당을 받고 문자열을 입력받는다면
쉽게 다음 chunk의 사이즈 영역을 건들일 수 있다.

그 후 각각의 heap 영역을 표시하기 위해 아래와 같은 작업을 한다.



(영역 표시)


p1 에는 1로 가득채우고 , p2는 2로, p3은 3으로

그리고 p2를 free해준다.



(free)


p2 를 free 해준다.

그렇게 되면 가운데가 구멍이 뚫린 상황이 된다.
p1 - p2(free됨) - p3

실제 같으면 p1에 heap overflow를 이용하여 p2의 사이즈 영역을 덮어썻을 것이지만
테스트 코드이므로 직접 사이즈 영역에 값을 작성할 것이다.

(아직 우리가 해당 주소를 가지고 있으므로 p2에!)



(적어줄 사이즈)


evil_chunk_size는 우리가 가짜로 적을 사이즈이고,
evil_region_size는 우리가 추후에 malloc을 할 때 사용할 값이다.

우리는 지금 free 된 p2의 영역의 SIZE 필드에 0x181이라고 적을 것이다.
맨 마지막 비트가 1인 이유는 이전 청크가 사용중이기 때문에 1이라고 섬세하게 맞춰준다.



(SIZE 조작)


그렇게 되면 p2의 영역은 free된 상황인데,
free 된 청크의 크기가 0x180 이라고 설정되어있는 상황이다.

변화 과정을 메모리에서 살펴보면


(덮어쓰기 전)



(덮어쓴 후)


덮어쓴 후 p2의 메모리 영역에 SIZE를 보면 0x181이라고 덮어쓰여진 것을 확인 할 수 있다.

그렇기에 지금 freelist에 p2가 있을 것이고,
p2의 청크 크기는 0x180으로 설정되어있는 셈이다.

그렇다면 여기서 malloc(0x180)을 한다면?



(malloc(0x180))


그러면 p2의 영역을 주는데 0x180 만큼의 크기를 할당해줄 것이다.
그러면 p3는?
-> 잊혀진 것이다. 알 길이 없다. (The Forgotten Chunks 의 작명센스!)

return 된 주소를 확인해보자.


(return 된 주소)



(return 영역)


return 된 영역을 보면 원래 p2의 시작점인데
사이즈는 0x180만큼으로 그 안에 p3 영역이 있는 것을 볼 수 있다.

덮어쓰여진 것을 한번 테스트해보자!



(4로 덮어쓰기)


p4안에 p3이 들어있다.

그러면 p4의 영역을 4로 가득채우면?



(결과)


p3의 영역 또한 4로 덮어쓰여지게 된다.

그러면 p3을 3으로 다시 덮어쓰면?



(3으로 덮어쓰기)



(결과)


이번엔 p4의 영역 중간에 3으로 덮어쓰여지게 된다.

how2heap의 이 자료에서는 
해제된 free의 SIZE를 조작하고 malloc 하는 방법을 택했다.

반대로
malloc된 청크의 사이즈를 조작한 후, 다시 free하고
malloc 하는 방식으로 똑같은 결과를 만들 수 있다.

이 방법은 The Forgotten Chunks 문서에 나와있다.

'Vulnerability_Tech > About Heap' 카테고리의 다른 글

(how2heap) - overlapping_chunks_2  (0) 2018.02.27
(how2heap) - house of lore  (0) 2018.02.21
(how2heap) - poison null byte  (0) 2018.02.20
malloc의 사용가능 영역(HEAP)  (0) 2018.02.20
(how2heap) - house_of_spirit  (0) 2018.01.17

+ Recent posts