Hack/Pwnable
-
malloc - do_check_chunk()Hack/Pwnable 2016. 12. 1. 04:04
do_check_chunk는 말 그대로 chunk를 check 하는 매크로이다. 현재 Chunk의 사이즈를 sz 변수에 초기화한다. max address는 av의 top과 현재 청크의 top chunk사이즈를 더한값이 max address가 되고,min_adress는 max_address 에서 system_mem 즉, 현재 할당된 메모리 양을 뺀다. system_mem은 malloc_state 구조체 멤버로, 현재 할당된 메모리양을 추적하는데 사용된다. if 문에서 chunk_is_mmaped로 현재 청크를 인자로 받는데, #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) 이렇게 define 되어있는것을 확인 할 수 있고, chunk의 size에서 플래그값인 ..
-
malloc - unlinkHack/Pwnable 2016. 12. 1. 02:17
123456#define unlink(P, BK, FD) { \ FD = P->fd; \ BK = P->bk; \ FD->bk = BK; \ BK->fd = FD; \}Colored by Color Scriptercs unlink는 free가 연속적으로 될때 병합시키기위해 호출되는 매크로이다. P는 현재 청크이고, 위 인스트럭션은 아래와 같이 나타난다. FD = *P + 8; BK = *P + 12; FD + 12 = BK; BK + 8 = FD; 위를 보면 FD와 BK 포인터를 조작할 수 있게되면 FD+12 위치를 BK로 덮을 수 있다는 얘기가 된다. 그래서 항상 double free bug 공격을 할 때, fd-12 위치를 넣어주는 이유도 +12가 되기때문에 fd에 제대로 작성하기위해 -12를 넣어주..
-
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..