전체 글
-
Memory Mitigation 메모리 보호기법CTF/KNOWLEDGE 2021. 1. 19. 02:28
PRELIMINARY 서론 시스템해킹을 공부하다 보면 다양한 공격 방법과 이를 방어하기 위한 보호 기법의 변천사에 대해 알 수 있다. 각각의 공격 방법이 성립하는 조건과 원리에 대해 이해하는 것은 매우 중요하며, 이를 알기 위해서는 보호 기법에 대한 이해 또한 필수적이다. pwnable을 하면서 만나게 되는 다양한 보호 기법들과 이에 대한 우회 방법에 대해 정리해보자. 보호 기법이 방지하는 공격 기법들은 붉은색, 우회 방법은 초록색으로 표기하였다. ASLR(Address Space Layout Randomization) ASLR 보호기법은 공유 라이브러리, 스택 및 힙이 매핑되는 메모리 영역의 주소를 임의로 배치한다. 그 이유는 공격자가 코드를 작성할 때 payload가 어느 위치에 삽입되야 하는지를 미..
-
RTL(Return-to-libc)CTF/PWNABLE 2021. 1. 16. 03:55
Constraint 제약 조건 Libc base address(라이브러리에 존재하는 gadget을 사용하기 위해) Stack buffer overflow(지역 변수에서의 overflow를 이용해 ret를 gadget의 주소로 조작) Function Epilogue(함수가 exit(0)등을 통해 종료될 경우 ret을 호출하지 않으므로) PRELIMINARY 서론 NX bit(No-eXecute bit)는 실행해야 할 명령어가 존재하는 코드 영역과 데이터가 저장되는 영역의 실행 권한을 분리하고자 도입된 기술이다. NX 특성으로 지정된 메모리 영역은 데이터 저장을 위해서만 사용되므로 buffer overflow를 통한 공격을 어렵게 한다. 위와 같이 NX bit가 적용된 바이너리를 vmmap을 통해 분석해 본..
-
level2CTF/XCTF 2021. 1. 16. 03:15
Disassembly 디스어셈블리 주어진 바이너리 파일을 Cutter를 사용해 분석하면, 디컴파일이 깔끔하게 되었기에 코드를 쉽게 파악할 수 있다. undefined4 main(void) { int32_t var_4h; vulnerable_function(); system("echo \'Hello World!\'"); return 0; } void vulnerable_function(void) { int32_t var_88h; system("echo Input:"); read(0, &var_88h, 0x100); // Stack buffer overflow return; } main 함수에서 vulnerable_function을 호출하고, 이 함수에서 Stack buffer overflow가 발생한다. ..
-
-
-
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와 같은 디컴파일러를 통해 코드의 윤곽을 유추하는데 도움을 받을 수 있지만, 디스어셈블된 어셈블리 코드는 프로그램에 대해 많은 정보를 가지고 있으므로 어셈블리어에 ..