[How2Heap] Overlapping_Chunks

Overlapping_Chunks.c

overlapping_chunks.c

이 기법은 glibc에서 tcache옵션이 disabled된 상태에만 작동한다.

simple chunks overlapping

heap에 chunk 3개를 할당해보자.
3개의 chunk가 여기에 할당됐다:
p1=0x603010
p2=0x603110
p3=0x603210

이제 p2 chunk를 free시켜보자
p2 chuck는 이제 unsorted bin안에서 그 크기의 새로운 malloc()을 제공할 준비가 되어있다
이제 p2를 free시킨 chunk의 크키를 overwrite할 수 있는 overflow를 시연해보자.
toy 프로그램의 경우, 마지막 세 개의 bit값은 중요하지 않다.
하지만, heap의 안정성을 유지하는 것이 베스트다.
이 안정성을 유지하기 위해 우리는 최하위 bit를 1(prev_inuse)로 표시할 것이다.
p1이 free chunk로 오인하지 않고 확실히 하기 위해 우리는 p2 chunk의 크기를 385로 설정할 것이다. 그렇게 하는 것은 우리에게 376의 region size를 준다.

이제 다른 chunk를 주입된 p2 chunk의 데이터 크기와 똑같은 크기에 할당해준다.
이 malloc은 우리가 크기를 바꾸었던, unsorted bin안에 있는, 전에 free되었던 chunk로부터 제공되어질 것이다.

p4는 0x603110에 할당되었고 0x603288에서 끝난다.
p3는 0x603210에서 시작해 0x603288에서 끝난다
p4는 p3와 overlap되어야한다, 이 경우에 p4는 모든 p3를 포함한다.

이제 p4 chunk안에 복사된 모든 것들은 p3 chunk에 있는 데이터를 overwrite할 수 있다
그리고 p3 chunk에 쓰여진 데이터는 p4 chunk 안에 저장되어있는 데이터를 overwrite할 수 있다.

이제 예시를 돌려보자. 지금, 우리는 가지고 있다:
p4 = x
3 = 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

If we memset(p4, ‘4’, 376), we have:
p4 = 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
p3 = 444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444

And if we then memset(p3, ‘3’, 80), we have:
p4 = 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444
p3 = 333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444

공유하기