CTF
-
-
-
Stack address leakCTF/PWNABLE 2021. 1. 14. 20:43
CONSTRAINT 제약 조건 Libc base address (environ ptr의 주소를 구하기 위해) Arbitary address content leak (environ ptr에 저장된 환경 변수의 위치를 구하기 위해) PRELIMINARY 서론 환경 변수는 운영 체제나 마이크로 서비스에 내장된, 프로그램 바깥에 설정된 변수이다. 이러한 변수들은 (name, value) 쌍으로 존재하는데, 프로세스가 시작할 때 불려와 리눅스 상의 사용자 주소 공간에 저장되었다가 런타임에 name이 value로 치환되는 방식으로 작동한다. [1][2] 이러한 환경 변수들은 main 함수 argc, argv 인자들과 함께 스택에 저장되는데, 이렇게 스택 상에 존재하는 환경 변수의 위치를 라이브러리에 있는 envir..
-
hook OverwriteCTF/PWNABLE 2021. 1. 14. 20:43
CONSTRAINT 제약 조건 Libc base address (hook variable의 주소를 구하기 위해) Arbitary address overwrite (hook variable을 덮어쓰기 위해) Function call (malloc, calloc, free등을 이용해 덮어쓴 hook을 호출) PRELIMINARY 서론 malloc.c를 통해 malloc 함수의 구현을 살펴보면 다음과 같다. void * __libc_malloc (size_t bytes) { mstate ar_ptr; void *victim; void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook !=..
-
Assembly Language 어셈블리어CTF/KNOWLEDGE 2021. 1. 14. 20:41
PRELIMINARY 서론 어셈블리어는 기계어와 일대일 대응되는 저수준 프로그래밍 언어이다. 고수준 언어로 작성된 소스 코드를 컴파일하면 어셈블리어로 변환되고, 어셈블러를 통해 이를 다시 기계어로 대응시키면 바이너리 파일이 만들어지게 된다. [1] 바이너리 파일이 주어졌을때, 원형이 되는 소스 코드가 무엇인지는 정확히 알 수는 없다. 그러나 시스템 해킹(pwnable)을 위해서는 프로그램이 어떻게 동작하는지 알아야 하고, 바이너리를 역으로 분석하여 작동 과정을 알아내는 리버스 코드 엔지니어링(reversing)이 필요하다. IDA나 Ghidra와 같은 디컴파일러를 통해 코드의 윤곽을 유추하는데 도움을 받을 수 있지만, 디스어셈블된 어셈블리 코드는 프로그램에 대해 많은 정보를 가지고 있으므로 어셈블리어에 ..
-
Oneshot gadgetCTF/TOOL 2021. 1. 8. 20:24
PRELIMINARY 서론 oneshot gadget(magic gadget)이란 해당 gadget 하나만을 이용하여 shell을 획득할 수 있는 gadget이다. [1] 대표적으로는 execve("/bin/sh") 등이 이에 해당하는데, 신기하게도 rdi에 "/bin/sh"의 offset 주소를 전달하고 execve 함수를 실행하는 코드가 libc 내부에 존재한다. 위와 같이 "/bin/sh"의 주소를 레지스터에 전달하는 부분을 검색해보자. 만약 e6e73 부분의 코드를 실행한다면 함수의 처음 세 인자를 저장하는 rdi, rsi, rdx에 순서대로 값이 전달된 후 execve 함수가 실행될 것이다. 추가로, 위 코드를 통해 쉘을 취득하려면 r10과 r12가 NULL이어야 한다. 그렇다면 이러한 코드의 ..
-
RET OverwriteCTF/PWNABLE 2021. 1. 8. 20:23
CONSTRAINT 제약 조건 Exploit gadget address(shellcode, oneshot_gadget, etc.) Stack buffer overflow(지역 변수에서의 overflow를 이용해 ret를 gadget의 주소로 조작) Function Epilogue(함수가 exit(0)등을 통해 종료될 경우 ret을 호출하지 않으므로) PRELIMIARY 서론 해당 포스팅은 어셈블리어와 스택 프레임파트의 내용을 기반으로 한다. x86 Architecture의 stack frame은 다음과 같다. 메모리의 스택(stack) 영역은 함수 호출에 의해 할당되고, 지역 변수와 매개변수가 저장되는 영역이다. Caller 영역은 호출된 함수의 매개변수, 호출이 끝난 후 돌아갈 return addres..
-
pwngdbCTF/TOOL 2021. 1. 8. 05:23
PRELIMINARY 서론 pwngdb는 pwn을 위한 GDB(GNU Debugger)이다. 명령어의 실행마다 레지스터, 스택, 실행 중인 코드의 정보 등을 색깔과 함께 보여주며 exploit에 유용한 기능을 다수 포함하고 있다. 다음 명령어를 터미널에 입력해 pwngdb를 설치하자. $ cd ~ $ git clone https://github.com/longld/peda.git ~/peda $ git clone https://github.com/scwuaptx/Pwngdb.git $ cp ~/Pwngdb/.gdbinit ~/ gdb를 사용하기 위해서는 터미널에 gdb를 입력해주면 된다. 다음은 pwngdb의 주요 기능과 사용법에 대해 알아보자. Control 제어 gdb [바이너리]를 통해 원하는 바이..