Heap exploitation/how2heap
-
House of Orange - how2heapHeap exploitation/how2heap 2020. 2. 26. 13:59
Abstract House of Orange는 Fake _IO_FILE_plus를 만들고 IO_list_all를 수정한 후 의도적으로 힙에 손상을 일으켜 에러 메시지를 출력하게 한다. 이 때 abort.c 안의 _IO_flush_all_lockup()을 통해 에러 메시지를 출력시키는데, IO_list_all이 수정되었기에 fake _IO_FILE_plus를 실제 File Stream chain으로 인식한다. 이후 이에 대해 _IO_OVERFLOW()를 호출하게 되는데, fake _IO_FILE_plus의 vtable을 참조하기 때문에 RIP를 컨트롤할 수 있다. 말이 너무 길어졌는데, 순서대로 설명하면 아래와 같다. Exploit flow 적당히 큰 free된 청크를 만들기 위해 Top Chunk를 원래..
-
fastbin_dup_consolidate - how2heapHeap exploitation/how2heap 2020. 2. 17. 21:20
Abstract fast chunk와 large chunk를 이용한 fastbin_dup 기법이다. 이름대로 청크 병합을 할 때 발생하는 취약점인데, 힙에서 병합이 일어나는 경우는 아래 두가지가 있다. prev_inuse비트가 해제된 청크를 해제했을 때 prev chunk와 병합 혹은 prev_inuse 비트가 해제된 청크의 앞으로 두번째 청크가 해제했을 때 그 뒤 청크와 병합한다. (해제하는 청크의 앞 혹은 뒤 청크가 해제된 경우) large chunk를 할당했을 때 fastbin chunk와 인접해있는 경우 fastbin chunk와 병합한다. 위 2번째 상황에서 large chunk와 fastbin chunk가 인접해있지 않은 경우 fastbin chunk를 smallbin으로 이동한다 → fast..
-
fastbin_dup_into_stack - how2heapHeap exploitation/how2heap 2020. 2. 17. 20:53
Abstract fastbin_dup을 응용한 기법이다. fastbin_dup를 응용한 기법이다. fastbin_dup과의 차이점은 double-free를 한 후 다시 첫번째, 두번째 청크를 할당하고 첫번째 청크의 fd값을 stack의 주소(여기서는 stack이라 했지만 할당을 원하는 주소)로 변경해주는 것이다. fd값을 변경한 후 다시 같은 크기의 청크를 요청하면 stack의 주소를 리턴해준다. 주의점: fastbin에서 재할당을 할 때는 청크의 사이즈가 요청한 사이즈와 같은지 확인한다. 그래서 변경한 fd값 + 0x8(64bit 기준)의 주소에 청크 사이즈가 저장되어 있어야 한다. 청크의 사이즈는 4바이트만 검사하기 때문에 하위 4바이트만 크기를 맞춰주면 된다. Exploit Flow 동일한 크기의 ..
-
fastbin_dup - how2heapHeap exploitation/how2heap 2020. 2. 17. 20:22
Abstract double-free bug를 이용해 fastbin에 동일한 청클를 두번 등록해 할당받을 수 있는 기법이다. Exploit Flow 1. 동일한 크기의 fast chunk를 3개 할당 2. (1), (2) 순서로 free 3. (1)을 한번 더 free → double-free 4. 동일한 크기의 fast chunk를 3개 할당 → 첫번째, 세번째 할당받은 주소가 같다. Code #include #include int main() { fprintf(stderr, "This file demonstrates a simple double-free attack with fastbins.\n"); // 3개의 힙을 할당 fprintf(stderr, "Allocating 3 buffers.\n");..