예를 들어

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

+ Recent posts