먼저 Poison NULL Byte 의 경우 Off by one 에 기원을 둔 heap 취약점이다. 간략하게 이 취약점에 대해 정리하자면, 이미 할당된 heap chunk 를 새로 할당받는 heap 의 공간에 포함시켜 새로운 값으로 덮여 쓸 수 있는 취약점이다. #include #include #include #include #include int main() { printf("Welcome to poison null byte 2.0!\\n"); printf("Tested in Ubuntu 14.04 64bit.\\n"); printf("This technique can be used when you have an off-by-one into a malloc'ed region with a null byt..
house_of_spirit #include #include int main() { printf("This file demonstrates the house of spirit attack.n"); printf("Calling malloc() once so that it sets up its memory.n"); malloc(1); printf("We will now overwrite a pointer to point to a fake 'fastbin' region.n"); unsigned long long *a; // This has nothing to do with fastbinsY (do not be fooled by the 10) - fake_chunks is just a piece of memor..
제목처럼 glibc 2.27 일부 라이브러리 부터 생긴 IO_str_overflow, finish 등에서 callback 포인터를 없애서 FSOP 를 못하고 있었는데, 찾아보니 매우 다양한 시각으로 FILE 구조체를 접근하여 FSOP를 시도할 수 있다는 것을 알게되었다. 그 중 House of apple 이라는 녀석이 매우 매력적이였는데, 이는 잘만 FILE 구조체를 수정하면 한번의 수정만으로 (하나의 읽기 쓰기가 가능한 메모리 공간, 주소만 있으면 됨) 익스가 되기때문이다. --> 이에 대한 내용으로 제 26회 해킹캠프에서 포너에게 조금이나마 도움이 되기위해 발표했었기 때문에 이 기법에 대한 자세한 설명은 생략하도록 하겠다. (궁금한게 있는 사람은 댓글 달아주시면 보충 설명해주는 글을 포스팅 하겠습니다..
배경지식 ELF는 GOT를 활용하여 반복되는 라이브러리 함수의 호출 비용을 줄인다. 이때 GOT에 값을 쓰게 되는데, 그 중 처음 호출 될떄 함수의 주소를 구하고, 이를 got에 적는 Lazy Binding 방식이 있다. 이때 Lazy Binding의 특성 상 GOT를 실시간 업데이트(실행 중) 해야하므로, GOT에 쓰기 권한이 부여되는데, 이는 GOT를 변조 시킬 수 있는 취약점으로 연계될 수 있다. .init_array && .fini_array ELF의 데이터 세그먼트에는 프로세스의 초기화 및 종료와 관련된 .init_array, .fini_array가 존재하고 이 영역들은 프로세스의 시작과 종료에 실행할 함수의 주소를 저장하고 있다. 이때 이 주소값을 임의의 값을로 덮어 쓴다면 어떻게 될까? 답은..
Tcache dup / glibc 2.26 tcache는 Double Free와 같은 버그의 검증이 존재하지 않아 fastbin 등과 같은 다른 bin에서의 공격의 난이도가 훨씬 낮다. tcache dup은 Double Free 버그를 이용하여 tcache_entry 를 조작해 이미 할당된 메모리에 다시 힙 청크를 할당하는 공격기법이다. #if USE_TCACHE { size_t tc_idx = csize2tidx (size); if (tcache && tc_idx counts[tc_idx] < mp_.tcache_count) { tcache_put (p, tc_idx); return; } } fastbin dup 에서는 이전에 해제된 청크인 old 와..
_IO_FILE AAR 파일 쓰기 함수는 대표적으로 fwrite, fputs가 있다. 해당 함수들은 라이브러리 내부에서 _IO_sputn 함수를 호출한다. _IO_sputn 은 _IO_XSPUTN 의 매크로이며 실질적으로 _IO_new_file_xsputn 함수를 실행한다. _IO_new_file_xsputn code #define _IO_sputn(__fp, __s, __n) _IO_XSPUTN (__fp, __s, __n) _IO_size_t _IO_new_file_xsputn (_IO_FILE *f, const void *data, _IO_size_t n) { ... if (to_do + must_flush > 0) { _IO_size_t block_size, do_write; /* Next flu..