저번까지 house of orange 공격기법에 대해 써봤으니 이번에는 진짜 바이너리 가지고 익스를 해보겠습니다. main 함수와 실행했을때의 모습입니다. 힙 메뉴를 가지고 있는 전형적인 문제라고 할 수 있습니다. int make_house() { unsigned int size; // [rsp+8h] [rbp-18h] signed int color; // [rsp+Ch] [rbp-14h] void *malloc_header; // [rsp+10h] [rbp-10h] _DWORD *v4; // [rsp+18h] [rbp-8h] if ( house_cnt > 3u ) { puts("Too many house"); exit(1); } malloc_header = malloc(0x10uLL); printf("..
저번까지는 가짜 구조체를 작성하는 방법에 대해 알아보았습니다. 이제는 _IO_list_all을 덮음으로서 이 가짜 구조체를 진짜라고 인식하게 하는 과정을 거쳐야합니다. _IO_list_all을 덮는 방법에 대해서는 fastbin double free, unsorted bin attack 등 여러개가 있을테지만 이번에는 unsorted bin attack을 상용할 것입니다. 여기서 1가지 문제점이 발생하는데 unsorted bin attack을 사용하여 _IO_list_all을 main_arena + 88로 덮게 되면 그 부분은 bin 관려한 정보가 있는 main_arena영역이기 때문입니다. int _IO_flush_all_lockp (int do_lock) { int result = 0; FILE *f..
2019/08/09 - [분류 전체보기] - _int_malloc 함수 분석 (2) _int_malloc 함수 분석 (2) 2019/08/09 - [힙(heap)] - _int_malloc 함수 분석 (1) _int_malloc 함수 분석 (1) INTERNAL_SIZE_T nb; /* 요청한 크기를 알맞게 가공한 변수*/ unsigned int idx; /* 연관된 bin의 index */ mbinptr bin; /* 연.. youngsouk-hack.tistory.com 이 글과 이어지는 내용입니다. 안보셨으면 보고 오시는 것을 추천드립니다. } /* place chunk in bin */ if (in_smallbin_range (size)) { victim_index = smallbin_index ..
mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ 필요한 변수 선언 void (*hook) (void *, const void *) = atomic_forced_read (__free_hook); if (__builtin_expect (hook != NULL, 0)) { (*hook)(mem, RETURN_ADDRESS (0)); return; } 이전 글과 마찬가지로 더 공부한 뒤 나중에 설명하겠습니다. if (mem == 0) /* free(0) has no effect */ return; NULL 메모리를 free하는 것은 효과가 없다, p = mem2chunk (mem); if (chunk_is_mmapped (p)) /* release ..
mstate ar_ptr; void *victim; 필요한 변수를 선언한다. void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); calloc때와 마찬가지로 더 공부한 뒤에 따로 설명하겠습니다, ㅠ.ㅠ #if USE_TCACHE /* int_free also calls request2size, be careful to not pad twice. */ size_t tbytes; checked_request2size (bytes, tbytes); size_t tc_idx = csiz..