Hack
-
malloc chunk2memHack/Pwnable 2016. 12. 1. 01:30
#define chunk2mem(p) ((void*)((char*)(p) + 2*SIZE_SZ)) chunk2mem은 여기저기 많이 사용되는데, p를 인자로 받는다. p는 해당 청크를 나타내는데, define으로 뒤에 인자를 받아들인다. 저 값이 무엇인지 대충봐도, p의 실제 주소를 갖고오고 거기에 16을 더한다. 그니까, prev_size와 size,fd,bk 이후에 장되는 영역 주소를나타내주는 함수이다. test.c123456789main(){ //((void*)((char*)(p) + 2*SIZE_SZ)) char *p1 = malloc(256); printf("%p\n",((void*)((char*)(p1) + 2*8))); return 0; }Colored by Color Scriptercs
-
-
[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;}Colored by Color Scriptercs 위의 코드에서는 메모리의 현재 블록에 대한 포인터를 해제하고, p와 현재 arena에 대한 포인터를 가지고 있다.이 검사는 특히 현재 청크가 아레나의 top chunk가 아니라는 것을 보여준다. 청크가 처음 free 될 때 청크가 top chunk와 마주 칠때 발생한다. 두번째 검사는 다음 청크가 arena 끝을 지나는지 확인한다. 123456if..
-
[BlackHat Heap] Traditional double free() exploitationHack/Pwnable 2016. 11. 30. 02:16
위는 청크가 할당될 때의 모습이다. free list에 있는 Chunk는 아래와 같다. 이제 다음은 청크가 할당되고, 연속적으로 두번 free 했을때의 상태를 나타낸다. 위는 처음 청크가 free 되었을때이다. 위는 이어 두번째 청크가 free 되었을때다. 여기서의 문제점은 똑같이 메모리 블록에 대한 포인터가 연결된 list에서 두번 발생하는것이다. 그 다음에 본질적으로 발생하는것은 malloc()에 대한 다음 호출이 발생할 때이다. 여기서 특히 고전적인 공격인 unlink() 매크로를 공격하는 것이다.unlink 매크로는 다음과 같이 정의되어있다. 123456#define unlink(P, BK, FD) { BK = P->bk; FD = P->fd; FD->bk = BK; BK->fd = FD;}cs ..
-
[BlackHat Heap] Free a chunkHack/Pwnable 2016. 11. 30. 01:45
청크를 free() 하는 과정은 public_free함수에 들어가면 초기화 된 모든 debuging hooks가 호출된다.free() 에 전달된 포인터가 NULL이면 그 루틴은 즉시 리턴되고, 아니면 청크에 대한 내부 포인터가 얻어지며 mmap()을 통해 할당되었는지 확인하고, 맵핑되지 않았으면 루틴을 반환한다. 그렇지 않으면, arena_for_chunk()에 대한 호출을 통해 청크의 arena를 얻는다. arena가 발견된다면, mutex lock을 하고, _int_free()에 대한 호출이 arena에 대한 포인터와 free()에 전달된다. 나머지는 알아서 읽으셔욧...!
-
[BlackHat Heap] Allocate a blockHack/Pwnable 2016. 11. 30. 01:37
[ Allocate a fastbin chunk ] 할당된 Chunk가 fastbin Chunk 사이즈 내에 있으면, fastbin 크기에 대한 인덱스를 얻고, fastbin ptr은 그 인덱스를 현재의 아레나 내의 fastbin array의 오프셋을얻어 초기화한다.반환된 포인터가 NULL이 아니고 할당 된 청크가 그 크기에대한 fastbin single linked list의 첫번째 블록에 할당 될 때 'victim' 이란 변수가 반환되도록 한다.이 청크가 실제로 fastbin에 있어야 하는것을 확인하기 위해 보안 검사가 수행된다. 검사를 통과하면, fastbin 배열에 대한 포인터가 list의 다음 청크에 할당이 된다.check_remalloced_chunk()에 대한 호출이 이루어졌지만 MALLOC..
-
[BlackHat Heap] BinningHack/Pwnable 2016. 11. 29. 23:11
메모리가 free() 된 후에는, bin이라는 링크드 리스트에 저장된다. 검색을 위해서 주어진 청크에서 가장 빠른 액세스를 허용하는 크기로 정렬이된다. 즉, free() 할 때, 실제로 운영체제로 리턴이 되지않지만 나중에있을 할당을 위해 빈의 linked list로 저장된다. bin은 링크드 리스트에대한 포인터 배열이다. 기본적으로 fastbin과 normal bin이 존재한다. fastbin을 사용하기위해서는 작은 청크를 가져야한다. free() 될때 주변 청크와 병합되지않고 정렬되지않으며, single linked list를 갖는다. 청크의 구조체는 normal 청크와 동일하며, 표현법만 다르다. 기존의 FIFO 방식과 달리 LIFO 방식으로 제거되고, 청크가 통합되지 않아 액세스 속도가 정상적인 청..
-
[BlackHat Heap] Chunks of memoryHack/Pwnable 2016. 11. 29. 22:37
Chunk 메모리는 malloc_chunk , mchunkptr 구조체로 구성되어있다. 1234567struct malloc_chunk { INTERNAL_SIZE_T prev_size; INTERNAL_SIZE_T size; struct malloc_chunk* fd; struct malloc_chunk* bk;}cs INTERNAL_SIZE_T prev_size : 현재 청크의 기준에서 이전의 청크의 사이즈를 나타낸다. 이전 청크가 사용가능하지않은 경우에만 사용된다. (free) INTERNAL_SIZE_T size : 현재 청크의 크기를 나타낸다. struct malloc_chunk *fd : 청크가 free된 경우, 다음 청크를 가리키는 포인터이다. double linked list로 관리된다. ..