-
[BlackHat Heap] GNU libc's double free() protectionHack/Pwnable 2016. 11. 30. 02:29
[ Normal bin chunks ]
free() 되는 동안 normal bin 청크가 top chunk와 비교하여 검사된다.
12345if (__builtin_expect (p == av->top,0 )){errstr = "double free or corruption (top)";goto errout;}cs 위의 코드에서는 메모리의 현재 블록에 대한 포인터를 해제하고, p와 현재 arena에 대한 포인터를 가지고 있다.
이 검사는 특히 현재 청크가 아레나의 top chunk가 아니라는 것을 보여준다. 청크가 처음 free 될 때 청크가 top chunk와 마주 칠때 발생한다.
두번째 검사는 다음 청크가 arena 끝을 지나는지 확인한다.
123456if (__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 비트 세트가 있음을 확인 한다.
1234if (__builtin_expect (!prev_inuse(nextchunk), 0)) {errstr = "double free or corruption (!prev)";goto errout;}cs 이것은 normal bin 청크가 다중 빈 상태의 중간에 있는 여부를 확인하는 검사이다.
fastbin에 대한 체크가 무엇인지 살펴 볼 것이다.
12345if (__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