System/System Hacking

    [Heap] Double Free 취약점

    ◾ 실습 환경: Ubuntu 16.04 (glibc 2.23) Double Free와 U-A-F 취약점은 C 언어에서 동적 메모리를 관리를 올바르지 않은 방식으로 했을 때 발생하는 취약점들이다. Double Free 해제된 메모리를 다시 한 번 해제하는 취약점이다. 📌 힙을 할당했다가 해제하면서 할당되었던 힙 청크의 주소가 크기에 맞는 bin (fastbin/unsorted bin/samllbin/largebin)에 들어가고, 같은 bin에 해당되는 크기로 재할당 요청이 오면 순차적으로 할당이 된다. 이 때, double free가 발생해 중복된 주소가 bin에 들어가게 되었을 때, 같은 크기로 할당 요청이 여러 번 들어오게 되면 동일한 메모리에 두 개의 객체가 할당될 수 있다. 이 점을 이용해 이미 해..

    [Heap] Security Check

    _int_malloc, _int_free는 heap이 정상동작 하지 못하는 경우를 방지하기 위해 검증 코드가 존재한다. 이 검증 코드를ㄹ 이해하고 있어야 익스플로잇 할 때 우회해서 공격할 수 있다. _int_malloc malloc(): memory corruption (fast) #define fastbin_index(sz) \ ((((unsigned int) (sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2) idx = fastbin_index (nb); if (victim != 0) { if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0)) { errstr = "malloc(): memory corruption (f..

    [Heap] ptmalloc2

    Memory Allocator dlmalloc, ptmalloc2, jemalloc, tcmalloc, libumem 등의 메모리 할당자 대부분의 운영체제에서 동적할당 시, 힙 페이지 생성 ptmalloc2 리눅스 GLIBC (GNU C Library)에서 사용하는 메모리 할당자 서로 다른 스레드가 서로 간섭X ,서로 다른 메모리 영역에 접근 dlmalloc 코드를 기반으로 멀티 스레드에서 사용되도록 확장; 한 번에 두개 이상의 메모리 영역을 활성화 해 멀티 스레드 효율적으로 처리복수의 스레드가 동시에 malloc을 호출: 각 스레드는 별도의 heap segment 생성 + 해당 heap을 유지 보수하는 데이터 구조 분리해 메모리에 할당 $ wget https://ftp.gnu.org/gnu/glibc/..

    Return to csu (ft. Return-to-vuln, Just-In-Time Code Reuse)

    return-to-csu x64 https://doongdangdoongdangdong.tistory.com/62?category=869864 return-to-vuln ROP 코드를 실행한 후 취약성이 있는 코드로 다시 이동 gcc로 컴파일된 파일 "leave ; ret ;" gadget을 이용해 return-to-dl-resolve 기법으로 스택의 흐름을 변경할 수 있다. clang으로 컴파일된 파일 "leave ; ret ;" gadget을 찾을 수 없다. clang 으로 컴파일된 바이너리는 스택(entry point)을 정리할 때 "leave" 명령어가 사용되지 않는다. ▶ Return-to-vuln 기법을 사용해 ROP 코드 실행 후 취약성이 있는 함수를 다시 호출해 공격 Just-In-Time..

    Return to csu (ft. JIT ROP)

    return-to-csu __libc_csu_init() 함수의 일부 코드를 gadget으로 이용하는 기술 void __libc_csu_init (int argc, char **argv, char **envp) { ... const size_t size = __init_array_end - __init_array_start; for (size_t i = 0; i < size; i++) (*__init_array_start [i]) (argc, argv, envp); } ( https://code.woboq.org/userspace/glibc/csu/elf-init.c.html#__libc_csu_init ) __libc_csu_init()함수 : 프로그램 실행 시, __init() 함수와 __preini..

    SROP x64

    Example //gcc -g -o sig64 sig.c #include #include struct sigcontext sigcontext; void handle_signal(int signum){ printf("Signal number: %d\n", signum); } int main(){ signal(SIGINT, (void *)handle_signal); while(1) {} return 0; } debugging - handle_signal()함수에 break point 설정 - handle SIGINT nostop pass: GDB가 interrupt에 반응하지 않도록 설정 - 실행 후 Ctrl+C 눌러 Interrupt 발생시킴 - bt: handle_signal 함수가 호출되기 전에 실행된..

    SROP x86

    Example //gcc -m32 -g -o sig32 sig.c #include #include struct sigcontext sigcontext; void handle_signal(int signum){ printf("Signal number: %d\n", signum); } int main(){ signal(SIGINT, (void *)handle_signal); while(1) {} return 0; } debugging - handle_signal()함수에 break point 설정 - handle SIGINT nostop pass: GDB가 interrupt에 반응하지 않도록 설정 - 실행 후 Ctrl+C 눌러 Interrupt 시그널 발생시킴 - bt: handle_signal 함수가 호출..

    SROP

    SROP (SigReturn-Oriented Programming) : sigreturn 시스템 콜을 이용해 레지스터에 원하는 값을 저장하는 방식 >> 원하는 시스템 함수를 호출할 수 있다. Signal : 프로세스에게 이벤트가 발생했음을 알리는 역할 - 다른 프로세스에게 시그널을 전송할 수 있다. = 시그널이 발생하면 그 시그널에 대한 결과로 다른 프로세스에게 시그널이 전송되는 것이 가능 원시적인 형태의 IPC (interprocess communication; 프로세스 간 통신)로 사용 자기 자신에게 시그널을 전송하는 것도 가능 - 일반적으로 커널이 시그널을 송신 - 이벤트 종류 하드웨어 예외가 발생한 경우 사용자가 터미널 특수 문자 중 하나(Ctrl+C; interrupt character)(Ctr..

    64bit ROP

    Return Oriented Programming(ROP) _x86 NX bit와 ASLR 보호기법, 코드 서명과 같은 보호기법을 우회할 수 있는 기술 프로그램의 흐름 변경을 위해 Stack Overflow와 같은 취약점을 이용해 콜 스택 통제 → 주로 스택 기반연산을 하는 코드 가젯(gadgets) 사용 >> RTL + Gadgets (64bit: 함수의 인자를 레지스터와 스택에 저장해 전달) gadgets 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어 일반적으로 "ret"(반환명령어)이 끝으로, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브루틴에 존재 x64에서는 호출 규약(System V AMD64 ABI) 때문에 피연산자가 매우 중요 x64의 ROP에서 POP 명령어의 역할 = E..

    32bit ROP

    Return Oriented Programming(ROP) _x86 NX bit와 ASLR 보호기법, 코드 서명과 같은 보호기법을 우회할 수 있는 기술 프로그램의 흐름 변경을 위해 Stack Overflow와 같은 취약점을 이용해 콜 스택 통제 → 주로 스택 기반연산을 하는 코드 가젯(gadgets) 사용 >> RTL + Gadgets (32bit: 함수의 인자를 스택에 저장) gadgets 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어 일반적으로 "ret"(반환명령어)이 끝으로, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브루틴에 존재 gadgets은 여러 개의 함수를 호출하기 위해 사용한다. -호출하는 함수의 인자가 3개일 때: "pop; pop; pop; ret" -호출하는 함수의 ..