저번까지는 가짜 구조체를 작성하는 방법에 대해 알아보았습니다. 이제는 _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..
mstate av; mchunkptr oldtop, p; INTERNAL_SIZE_T bytes, sz, csz, oldtopsize; void *mem; unsigned long clearsize; unsigned long nclears; INTERNAL_SIZE_T *d; 사용될 변수들을 선언해놓는다. /* size_t is unsigned so the behavior on overflow is defined. */ bytes = n * elem_size; #define HALF_INTERNAL_SIZE_T \ (((INTERNAL_SIZE_T) 1) = HALF_INTERNAL_SIZE_T, 0)) { if (elem_size != 0 && bytes / elem_size != n) { __set_..