SYSTEM HACKING/기법

    _IO_FILE vtable overwrite & _IO_FILE Structure

    _IO_FILE vtable overwrite & _IO_FILE Structure

    _IO_FILE관련 내용 정리 겸 작성합니다. 이해가 완벽히 되지는 않아서 틀린 점이나 모호하게 쓰는 점 이해 부탁드립니다. 혹시라도 잘못된 점 있으면 댓글 달아주세요!! 추가로 해당글은 Dreamhack강의를 기반으로 작성하였습니다. _IO_FILE 리눅스 시스템 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체. fopen(),fclose(),fwrite()...와 같은 함수들에 대해서 적용된다. 해당 구조체는 아래와 같으며 /libio/bits/types/struct_FILE.h에 정의되어 있다. struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers corr..

    Exploit using _rtld_global & exit()

    정리겸 작성합니다. 이전에 csu_init 관련해서 작성했던적이 있다. 2020.04.26 - [SYSTEM HACKING/기법] - Return to Csu Return to Csu Return to csu -특별하게 사용할 수 있는 Gadget이 없는 경우 __libc_csu_init()이라는 함수를 이용하면 함수를 호출 할 수 있게 인자를 설정을 할 수 있다. [__libc_csu_init()] 이 사진을 보면 두가지 파트로.. hoho9.tistory.com 바이너리를 처음 실행하게 되면 start함수를 실행하게 된다. 해당 실행과정에서 __libc_csu_init()함수를 호출하는데 이때 .init_array 섹션을 참조하게된다. 만약 Full Relro가 아닌 경우 해당 섹션을 덮어 쓸 수가 ..

    House of Force?

    House of Force?

    House of Force Top Chunk의 크기를 조작하여 원하는 주소에 chunk를 할당을 받는다. 이는 glibc 2.29 버전에서 패치가 되었으며, 최신 버전의 glibc에서는 작동을 하지 않는다. [+] 여담으로 이전에 house of force에 관해서 작성한 글이 있기는 한데.. 너무 허술한거 같아서 다시 작성한다 2018.03.08 - [SYSTEM HACKING/기법] - [How2Heap] House of Force 해당 실습 환경은 glibc 2.27에서 진행되었다. . . /* finally, do the allocation */ p = av->top; size = chunksize (p); /* check that one of the above allocation paths su..

    Unsafe unlink in glibc 2.23, 2.27 and over 2.27

    Unsafe unlink in glibc 2.23, 2.27 and over 2.27

    Unlink? Unlink란 bin list에 있는 chunk가 재할당이 되어서 bin list에서 빠져나올 때 이중연결리스트(fd,bk)로 연결된 노드를 빼기 위한 작업이다. /* Consolidate other non-mmapped chunks as they arrive. */ else if (!chunk_is_mmapped(p)) { ... if (!prev_inuse(p)) { prevsize = prev_size (p); size += prevsize; p = chunk_at_offset(p, -((long) prevsize)); unlink_chunk (av, p, bck, fwd); } ... 해당 코드는 free 함수의 코드 중 일부이다. 확인을 해보면 else if를 통해서 해당 chun..

    Poison Null Byte in glibc 2.27

    Poison Null Byte in glibc 2.27

    How 2 heap의 Poison_null_byte에 대해서 작성을 하고자 한다. poison_null_byte는 glibc version에 따라서 응용하는 방법이 다른 것 같다. 우선은 2.27에서 사용되는 poison_null_byte에 대해서 알아봤다. 해당 글은 glibc 2.27에서 작성되었다. Posion Null Byte? Poison null byte는 off-by-one을 기반으로 한 취약점이다. off-by-one은 버퍼 크기의 경계에 대한 검사가 문제로 인해서 1 byte를 더 쓸 수 있게 되는 취약점이다. 이를 통해서 heap의 size를 null byte로 덮는 것을 poison null byte라고 한다. . . pratice.c #include #include #include ..

    Fastbin double free in Glibc 2.3.x

    Fastbin double free in Glibc 2.3.x

    Heap관련 CTF 문제를 풀던 도중 double free 관련한 취약점을 찾고 이를 이용하려고 해봤지만 "free(): double free detected in tcache 2"이라는 오류문구와 함께 double free가 막히는 것을 확인하였다. 찾아본 결과 2.3.0버전 이후부터 glibc의 패치를 통해서 fastbin double free detection 기능이 추가됐다. 하지만 이를 우회하는 방법도 있어서 이에 대해서 작성 하고자한다. sourcecode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include #include #i..

    About Heap(2)

    About Heap(2)

    이전 글에서 malloc_chunk 구조체를 통해서 chunk의 구조에 대해서 간략하게 알아봤다. 이번에는 malloc,free시의 chunk에 대해 알아보고 bin에 대해서도 작성하고자 한다. 1.1 Allocated Chunk prev_size : 이전 청크가 해제된 경우, 해제된 이전 청크의 주소를 prev_size에 저장을 한다. 만약 이전 청크가 할당되어 있는 경우에는 이전 Chunk의 사용자 데이터가 배치 된다. size : 할당된 청크의 크기를 저장하고, 하위 3bit는 flag정보를 저장한다. About Flag NON_MAIN_ARENA [A] (0x4) : Sub Arena로 할당을 받았을 시 1로 설정, Main Arena로 할당을 받았을 시 0로 설정 IS_MMAPPED [M] (0..

    About Heap(1)

    About Heap(1)

    계기 생각을 해보니 이전에 heap에 관한 기법에 관해서 글을 쓴 적이 있었다. 하지만 메모리 할당,heap,malloc,free,chunk에 관해서 글을 쓴 적은 없었던 것 같다. 이러한 계기로 heap에 관한 글을 쓰게 된다. 1. Allocator 리눅스에서는 기본적으로 ptmalloc2라는 Memory Allocator를 사용하고 있다. 하지만 환경에 따라서 다른 Allocator를 사용을 할 수도 있다. 이 글에서는 ptmalloc2에 대해서 다루겠지만, dllmalloc,jemalloc...등등 여러 가지 라이브러리가 존재한다. ptmalloc2는 멀티 쓰레딩 기능을 지원한다. 멀티 쓰레딩 기능을 지원을 하면서 Arena라는 개념을 도입하여 사용하게 되는데, 이는 프로그램들을 더욱 효율적으로 ..

    Leak Stack Address

    충족될 점 Libc Base 주소를 미리 구한 상태 임의의 주소를 leak 할 수 있어야 함. libc에는 environ이란 symbol이 있다. 이 symbol은 메인 함수의 세번째 인자인 char **envp와 같은 가치를 가지고 있다. char **envp의 가치는 스택에 있고, 따라서 우리는 스택 주소를 구할 수 있다. (gdb) list 1 1 #include 2 #include 3 4 extern char **environ; 5 6 int main(int argc, char **argv, char **envp) 7 { 8 return 0; 9 } (gdb) x/gx 0x7ffff7a0e000 + 0x3c5f38 0x7ffff7dd3f38 : 0x00007fffffffe230 (gdb) p/x ..

    Windows Universal Shellcode - 이론

    Windows Universal Shellcode - 이론

    이 글은 윈도우 시스템 해킹 가이드 버그헌팅과 익스플로잇에 기반하여 작성했습니다. Windows Universal Shellcode 1 이상의 운영체제에서는 부팅 시 kernel32.dll 상위 2byte의 값이 변경되므로 기존 shellcode 이용이 어려워진다. 이에 보완해서 나온 것이 universal shellcode다. DLL Base의 주소와 함수의 Offset을 더하는 원리, Linux에서 aslr을 우회하기 위한 방법과 유사하다. (+PE구조 분석을 이용해야 한다.) (+추가적인 배경지식..) Background Knowledge TEB(Thread Environment Block) 현재 실행되고 있는 쓰레드의 정보를 담고 있는 구조체이다. 이러한 TEB의 주소는 FS 레지스터에 저장되어 ..