ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BlackHat Heap] GNU libc's double free() protection
    Hack/Pwnable 2016. 11. 30. 02:29

    [ Normal bin chunks ]


    free() 되는 동안 normal bin 청크가 top chunk와 비교하여 검사된다.


    1
    2
    3
    4
    5
    if (__builtin_expect (p == av->top,0 ))
    {
        errstr = "double free or corruption (top)";
        goto errout;
    }
    cs


    위의 코드에서는 메모리의 현재 블록에 대한 포인터를 해제하고, p와 현재 arena에 대한 포인터를 가지고 있다.

    이 검사는 특히 현재 청크가 아레나의 top chunk가 아니라는 것을 보여준다. 청크가 처음 free 될 때 청크가 top chunk와 마주 칠때 발생한다.




    두번째 검사는 다음 청크가 arena 끝을 지나는지 확인한다.


    1
    2
    3
    4
    5
    6
    if (__builtin_expect (contiguous (av) 
            && (char *) nextchunk
            >= ((char *) av->top + chunksize(av->top)), 0))
    {
            errstr = "double free or corruption (out)"goto errout;
    }
    cs


    arena가 연속적인지 아닌지 테스트하는 간단한 매크로를 가지고있다. 

    arena가 연속적이지 않게 하는 유일한 방법은 이미 청크를 가지고있을때 large chunk를 할당하는 것이다.

    많은 메모리 맵핑 된 섹션과 MORECORE()가 실패하여 mmap()을 다시 호출한다. 이 체크의 두번째 부분은 이 코드에서 next chunk라고 적절하게 명명 된 

    현재 청크의 다음 청크가 arena 밖에 있지 않다는 것이다. 이 상황은 이전 작업 동안 힙크기가 어떻게 든 감소한 경우에만 발생이 가능하다.




    세번째 검사는 다음 청크에 prev in use 비트 세트가 있음을 확인 한다.



    1
    2
    3
    4
    if (__builtin_expect (!prev_inuse(nextchunk), 0)) {
            errstr = "double free or corruption (!prev)";
            goto errout;
    }
    cs


    이것은 normal bin 청크가 다중 빈 상태의 중간에 있는 여부를 확인하는 검사이다.




    fastbin에 대한 체크가 무엇인지 살펴 볼 것이다.


    1
    2
    3
    4
    5
    if (__builtin_expect (*fb == p, 0))
    {
            errstr = "double free or corruption (fasttop)";
            goto errout; 
    }
    cs


    현재의 청크인 free()와 *fb를 갖는 P를 가지고 있다. 이것은 fastbin크기의 bin에서 첫번째 청크에 대한 포인터이다.

    fastbin 청크는 free() 될 때 정렬되지 않고, list 맨위에 놓인다.




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

    malloc chunk2mem  (0) 2016.12.01
    malloc분석  (0) 2016.12.01
    [BlackHat Heap] Traditional double free() exploitation  (0) 2016.11.30
    [BlackHat Heap] Free a chunk  (0) 2016.11.30
    [BlackHat Heap] Allocate a block  (0) 2016.11.30

    댓글

Designed by Tistory.