CS/system

    [System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget

    [System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget

    one_gadget(magic_gadget)은 실행하면 쉘이 획득되는 코드 뭉치를 말한다. 여러 gadget의 조합없이, 하나의 gadget만으로도 쉘을 실행할 수 있는 gadget이다. HITCON, 217 CTF팀의 david942j가 만든 one_gadget을 사용하면 쉽게 찾을 수 있다. one_gadget은 libc 버전마다 다르게 존재하고, 제약 조건도 모두 다르다. Glibc의 버전이 높아질수록 제약 조건을 만족시키기 어렵기 때문에, 상황에 따라 맞는 gadget을 사용하거나 제약조건을 만족하도록 조작해야한다. one_gadget은 함수에 인자를 전달하기 어려울 때 활용할 수 있다. __malloc_hock을 overwrite하는 것은 가능하지만 malloc의 인자에 "/bin/sh"을 전달..

    [System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)

    [System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)

    드림핵 RELRO 강의, 드림핵 wargame fho 문제에 대한 글이다. Free Hook Overwrite 실습 코드 // Name: fho.c // Compile: gcc -o fho fho.c #include #include #include int main() { char buf[0x30]; unsigned long long *addr; unsigned long long value; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); puts("[1] Stack buffer overflow"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); puts("[2] Arbitrar..

    [System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)

    [System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)

    후킹(hooking)은 코드 실행을 낚아채 다른 코드가 샐행되게 하는 것을 말하고, 이때 실행되는 코드를 훅(hook)이라고 한다. 후킹은 다양한 용도로 사용된다. 예를 들어 malloc과 free에 hook을 설치하면 소프트웨어에서 할당하고, 해제하는 메모리를 모니터링 할 수 있다. 이를 응용하면 함수 도입부에 모니터링 함수를 hook으로 설치하여 모든 호출 함수를 tracing 할 수 있다. 여기서는 hook overwrite와 one-gadget에 대해 공부할 것이다. Hook Overwrite는 Full RELRO가 적용되더라도 libc의 데이터 영역에 쓰는 것이라 Full RELRO를 우회할 수 있는 기법이다. Glibc 2.33이하에선 libc 데이터 영역에 malloc()과 free()를 호..

    [System][Dreamhack] RELRO - RELocation Read-Only

    [System][Dreamhack] RELRO - RELocation Read-Only

    Lazy binding은 ELF 바이너리에서 라이브러리 함수의 시작주소를 구하지 않다가, 함수를 처음 호출할 때 해당 주소를 구해 GOT에 저장하는 것을 말한다. Lazy binding을 하는 바이너리는 실행 중 GOT를 업데이트 해야하므로, GOT에 쓰기 권한이 부여된다. 이로 인해 GOT Overwrite 공격이 가능한 것이다. GOT 영역 외에도, ELF의 데이터 세그먼트에는 프로세스 초기화 및 종료와 관련된 .init_array, .fini_array가 있다. 해당 영역들은 프로세스 시작과 종료에 실행할 함수의 주소를 저장하고 있는데, 여기에 임의의 값을 쓸 수 있다면 프로세스 흐름 조작이 가능하다. 이런 overwrite로부터 데이터 세그먼트를 보호하고자 RELocation Read-Only(R..

    [System][Dreamhack] PIE - Position-Independent Executable

    [System][Dreamhack] PIE - Position-Independent Executable

    PIE(Position-Independent Executable)은 ASLR이 코드 영역에도 적용되게 하는 기술이다. PIC & PIE PIC 리눅스 ELF 파일은 실행파일(Executable)과 공유 오브젝트(Shared Object, so)로 2가지가 존재한다. 공유 오브젝트는 재배치(relocation)가 가능하다. Relocation이 가능하다는 것은 메모리의 어디에 적재되어도 코드의 의미가 훼손되지 않음을 의미한다. 이런 코드를 Position-Independent Code(PIC)라고 부른다. PIC 코드 분석 PIC가 적용된 바이너리와 그렇지 않은 바이너리를 비교하기 위해 아래의 코드를 컴파일하였다. // Name: pic.c // Compile: gcc -o pic pic.c // : gc..

    [System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP)

    [System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP)

    이전 실습은 system 함수를 호출하도록 하여 PLT에 system함수가 포함되어 있다. 하지만 실제로 system함수가 PLT에 포함될 가능성은 거의 없다. [system][hacking] Exploit Tech : Return to Library(RTL) NX를 우회하는 공격기법인 RTL에 대해 공부한 내용이다. RTL을 공부하기 전 NX가 무엇인지, PLT가 무엇인지 알아야 한다. 이에 대한 내용은 아래의 글에 정리되어 있다. [system][hacking] 메모리 보호기 3omh4.tistory.com 그래서 라이브러리 함수의 실행과 리턴가젯을 연결해 사용하는 ROP(Return Oriented Programming)와 GOT overwrite에 대해 드림핵으로 공부한 내용이다. ROP ROP는..

    [System][Dreamhack] Exploit Tech : Return to Library(RTL)

    [System][Dreamhack] Exploit Tech : Return to Library(RTL)

    NX를 우회하는 공격기법인 RTL에 대해 공부한 내용이다. RTL을 공부하기 전 NX가 무엇인지, PLT가 무엇인지 알아야 한다. 이에 대한 내용은 아래의 글에 정리되어 있다. [system][hacking] 메모리 보호기법 Mitigation: NX & ASLR 지난 글(Return to shellcode)를 보면 쉘을 딸 수 있었던 이유는 다음과 같다. return addr을 임의의 주소로 덮기 가능 → canary 도입 ⇒ canary leak 으로 우회 버퍼의 주소 알아내기 가능 버퍼안의 쉘코드 실 3omh4.tistory.com [system] PLT & GOT PLT(Procedure Linkage Table)과 GOT(Global Offset Table)는 동적 링크된 심볼의 주소를 라이브러..

    [System] PLT & GOT

    [System] PLT & GOT

    PLT(Procedure Linkage Table)과 GOT(Global Offset Table)는 동적 링크된 심볼의 주소를 라이브러리에서 찾을 때 사용하는 테이블이다. [system] library - Static Link vs Dynamic Link 코딩을 하면 #include 를 항상 넣어준다. printf 함수를 사용할 때, printf 함수를 직접 정의하지 않고 libc에 정의된 함수를 가져다가 사용한다. 이를 라이브러리라고 한다. 여러 프로그램이 printf를 사 3omh4.tistory.com PLT & GOT ASLR이 적용된 환경에서, 동적 링킹 바이너리는 바이너리가 실행될 때마다 라이브러리가 매핑된다. 바이너리가 실행되기 전까지 라이브러리 함수의 주소를 알 수 없기 때문에, 라이브러리..

    [System] library - Static Link vs Dynamic Link

    [System] library - Static Link vs Dynamic Link

    코딩을 하면 #include 를 항상 넣어준다. printf 함수를 사용할 때, printf 함수를 직접 정의하지 않고 libc에 정의된 함수를 가져다가 사용한다. 이를 라이브러리라고 한다. 여러 프로그램이 printf를 사용하는데 그때마다 라이브러리에서 어떻게 가져올지에 따라 static linking과 dynamic linking으로 나뉜다. 라이브러리부터 하나씩 정리해보겠다. 라이브러리 printf, scanf, strlen, memcpy, malloc 등 많은 함수들을 쓸 때, 직접 정의를 할 필요가 없다. 이는 이미 libc(표준 c 라이브러리)에 정의되어 있고 API는 헤더파일(stdio.h, stdint.h, ...)에 선언되어 있다. 그래서 #incldue 를 통해 직접 정의하지 않고 사용..