예를 들어
a1 = malloc(128);
a2 = malloc(128);
로 128바이트의 힙 영역을 두번 할당 받게되면 두 영역이 인접해진다.
여기서 만약
free(a1);
으로 첫번째 chunk가 해제된 상태라고 가정한다면
두번째 chunk 헤더는
prev_size : 00000090 size : 0x00000090
인 상태가 될 것이다. 자신 chunk의 size는 PREV_INUSE flag가 0이 된 상태다(이전 청크가 해제 되었단 의미)
이 상태에서
free(a2)
를 하게 되면 small bin의 특성상 두번째 chunk와 인접해서 해제되어있는 첫번째 chunk와 consolidation(병합) 하는 과정을 갖는다.
취약점은 여기서 터진다. 오버플로우를 통해 첫번째 chunk에 fack chunk를 만들어주고 두번째 chunk의 헤더에 prev_size를 첫번째 header까지의 거리로, size의 prev_inuse bit를 0으로 해주면 fack chunk와 병합을 하게 된다. 그렇게 되면 첫번째 chunk의 주소를 가지고 있는 전역변수에 원하는 값을 집어 넣을 수 있다.
말대로 첫번째 chunk의 주소가 전역변수에 저장된다면 FAKE chunk의 fd = (전역변수 - 0x18)와 bk = (전역변수 - 0x10)로 넣어준다. 그렇게 하면 병합과정에서 전역변수에 FAKE_FD가 들어갈 것이다.
/*
unlink가 트리거 되면
ptr1->FAKE_BK->FD = FAKE_FD
now, ptr1 == (long)&ptr1 - sizeof(long)*3;
*/
그런 다음 해당 전역변수의 값을 잘 조작할 수 있다면 공격을 할 수 있다.
'HACKING > System hacking' 카테고리의 다른 글
bash trick(꿀 tip) (0) | 2019.08.21 |
---|---|
tips for find binsh address using pwntool (0) | 2019.07.05 |
fastbin_dup_into_stack (0) | 2019.06.03 |
remote socket exploit?? (0) | 2019.02.03 |
memory cheat sheet (0) | 2019.01.17 |