ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BlackHat Heap] Traditional double free() exploitation
    Hack/Pwnable 2016. 11. 30. 02:16



    위는 청크가 할당될 때의 모습이다.


    free list에 있는 Chunk는 아래와 같다.







    이제 다음은 청크가 할당되고, 연속적으로 두번 free 했을때의 상태를 나타낸다.




    위는 처음 청크가 free 되었을때이다. 



    위는 이어 두번째 청크가 free 되었을때다.


    여기서의 문제점은 똑같이 메모리 블록에 대한 포인터가 연결된 list에서 두번 발생하는것이다. 그 다음에 본질적으로 발생하는것은 malloc()에 대한 다음 호출이 발생할 때이다.






    여기서 특히 고전적인 공격인 unlink() 매크로를 공격하는 것이다.

    unlink 매크로는 다음과 같이 정의되어있다.


    1
    2
    3
    4
    5
    6
    #define unlink(P, BK, FD) {
            BK = P->bk;
            FD = P->fd;
            FD->bk = BK;
            BK->fd = FD;
    }
    cs


    기본적으로 연결된 list의 노드를 제거하는 기본적인 작업을 하는것은 P 이다.


    P는 청크 자체에 대한 포인터이고, BK는 청크에 저장된 backward pointer이고, FD는 forward pointer를 나타낸다.

    따라서 BK 및 FD 포인터를 덮어 쓰면 이 매크로를 호출 할 때 어떤 4바이트를 우리가 선택한 4바이트로 덮어 쓸 수 있다.


    고전적인 다중 free() 익스플로잇의 흐름은 다음과 같다.


    1. 동일한 청크를 두번 free 하기

    2. 할당된 하나의 청크 중 하나 가져오기

    3. 사용 가능한 list의 청크에서 앞뒤 fd,bk 링크에 대한 두 포인터를 덮어 쓴다.

    4. unlink() 매크로가 호출되었을때 수정된 포인터가 사용되고, 임의의 주소가 겹쳐지도록 할당 된 사용 가능한 list에 있는 청크의 두번째 인스턴스를 가져온다.





    ----------------------


    unlink 매크로가 다음과 같이 변경되었다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define unlink(P, BK, FD) {
            FD = P->fd;
            BK = P->bk;
            if (__builtin_expect (FD->bk != P || BK->fd !=P,0))
                malloc_printerr ( check_action, "Corrupted double-linked list", P);
            else {
                FD->bk = BK;
                Bk->fd = FD;
            }
            
    }
    cs


    보는것과 같이 기본 청크 체크가 추가되어, 다음청크가 이전 청크가 현재청크와 동일하고 현재 청크가 이전청크, 다음청크가 현재 청크와 동일한지 확인한다.


    'Hack > Pwnable' 카테고리의 다른 글

    malloc분석  (0) 2016.12.01
    [BlackHat Heap] GNU libc's double free() protection  (0) 2016.11.30
    [BlackHat Heap] Free a chunk  (0) 2016.11.30
    [BlackHat Heap] Allocate a block  (0) 2016.11.30
    [BlackHat Heap] Binning  (0) 2016.11.29

    댓글

Designed by Tistory.