오늘 분석한 자료는 overlapping chunks이다.
이 방법은 The Forgotten Chunks 라는 문서에서 가져왔다고 하여
작명센스도.! 잊혀진 청크..!
전략을 간략히 말하자면
heap overflow를 통하여 청크의 SIZE 필드를 조작한다.
그리하여 malloc 혹은 free를 통하여 중첩된 영역을 얻는다.
* 중첩된 영역을 얻는다 라는 것에 대해서
-> 예를들어 A라는 malloc 영역이 주소 4~8 이라고 하자.
그리고 B에 malloc을 받는데 0~11의 주소로 할당을 받는다고 한다면?
B 주소 영역에 A의 주소 영역이 포함되어있다. 그렇기에 B에 작성하므로 A영역의 데이터를 건들일 수 도 있고, A에 작성하므로써 B영역의 데이터를 건들일 수 도 있는 상황이 된다.
우리는 중첩된 영역을 얻는 것을 목표로 할 것이다.
바로 -8 을 해준 이유는 사용 가능한 영역까지 꽉 할당받기 위해서이다.
포스트 글 malloc의 사용가능 영역
에 정리해 둔것을 참고하면 좋다.
https://blog.naver.com/rlagkstn1426/221212549437
실제의 상황에 위와같이 할당을 받고 문자열을 입력받는다면
쉽게 다음 chunk의 사이즈 영역을 건들일 수 있다.
그렇게 되면 가운데가 구멍이 뚫린 상황이 된다.
p1 - p2(free됨) - p3
실제 같으면 p1에 heap overflow를 이용하여 p2의 사이즈 영역을 덮어썻을 것이지만
테스트 코드이므로 직접 사이즈 영역에 값을 작성할 것이다.
evil_region_size는 우리가 추후에 malloc을 할 때 사용할 값이다.
우리는 지금 free 된 p2의 영역의 SIZE 필드에 0x181이라고 적을 것이다.
맨 마지막 비트가 1인 이유는 이전 청크가 사용중이기 때문에 1이라고 섬세하게 맞춰준다.
free 된 청크의 크기가 0x180 이라고 설정되어있는 상황이다.
그렇기에 지금 freelist에 p2가 있을 것이고,
p2의 청크 크기는 0x180으로 설정되어있는 셈이다.
그러면 p3는?
-> 잊혀진 것이다. 알 길이 없다. (The Forgotten Chunks 의 작명센스!)
사이즈는 0x180만큼으로 그 안에 p3 영역이 있는 것을 볼 수 있다.
how2heap의 이 자료에서는
해제된 free의 SIZE를 조작하고 malloc 하는 방법을 택했다.
반대로
malloc된 청크의 사이즈를 조작한 후, 다시 free하고
malloc 하는 방식으로 똑같은 결과를 만들 수 있다.
이 방법은 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)
바로 -8 을 해준 이유는 사용 가능한 영역까지 꽉 할당받기 위해서이다.
포스트 글 malloc의 사용가능 영역
에 정리해 둔것을 참고하면 좋다.
https://blog.naver.com/rlagkstn1426/221212549437
실제의 상황에 위와같이 할당을 받고 문자열을 입력받는다면
쉽게 다음 chunk의 사이즈 영역을 건들일 수 있다.
그 후 각각의 heap 영역을 표시하기 위해 아래와 같은 작업을 한다.
(영역 표시)
그리고 p2를 free해준다.
(free)
그렇게 되면 가운데가 구멍이 뚫린 상황이 된다.
p1 - p2(free됨) - p3
실제 같으면 p1에 heap overflow를 이용하여 p2의 사이즈 영역을 덮어썻을 것이지만
테스트 코드이므로 직접 사이즈 영역에 값을 작성할 것이다.
(아직 우리가 해당 주소를 가지고 있으므로 p2에!)
(적어줄 사이즈)
evil_region_size는 우리가 추후에 malloc을 할 때 사용할 값이다.
우리는 지금 free 된 p2의 영역의 SIZE 필드에 0x181이라고 적을 것이다.
맨 마지막 비트가 1인 이유는 이전 청크가 사용중이기 때문에 1이라고 섬세하게 맞춰준다.
(SIZE 조작)
free 된 청크의 크기가 0x180 이라고 설정되어있는 상황이다.
변화 과정을 메모리에서 살펴보면
(덮어쓰기 전)
(덮어쓴 후)
그렇기에 지금 freelist에 p2가 있을 것이고,
p2의 청크 크기는 0x180으로 설정되어있는 셈이다.
그렇다면 여기서 malloc(0x180)을 한다면?
(malloc(0x180))
그러면 p3는?
-> 잊혀진 것이다. 알 길이 없다. (The Forgotten Chunks 의 작명센스!)
return 된 주소를 확인해보자.
(return 된 주소)
(return 영역)
사이즈는 0x180만큼으로 그 안에 p3 영역이 있는 것을 볼 수 있다.
덮어쓰여진 것을 한번 테스트해보자!
(4로 덮어쓰기)
그러면 p4의 영역을 4로 가득채우면?
(결과)
그러면 p3을 3으로 다시 덮어쓰면?
(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 |