본문 바로가기

System Hacking

(9)
Malloc(3) - Arena (glibc의 ptmalloc2) 1. Arena란? ptmalloc2는 각 스레드가 서로 간섭하지 않고, 서로 다른 메모리 영역에 액세스 할 수 있게 하는데 이러한 메모리 영역을 "Arena"라고 한다. Arena는 멀티 쓰레드 환경을 지원하기 위해 도입된 개념이다. 각 Arena는 하나 이상의 힙 메모리를 얻는다. main arena는 프로그램의 초기 힙을 사용한다. (.bss 등 직후 시작) 단일 스레드 프로세스 경우에는 하나의 Arena를 가지지만, 멀티 스레드 프로세스 경우 하나 이상의 Arena를 가진다. 서로 다른 Arena안에 존재하는 각각의 스레드는 정지하지 않고, 힙 작업을 수행할 수 있다. 모든 스레드마다 각각의 Arena를 자원고갈 문제로 갖고 있는 것은 아니며, 32bit 또는 64bit system과 system..
Malloc(2) - Bin (glibc의 ptmalloc2) 1. Bin Free chunk는 크기와 히스토리에 따라 다양한 목록에 저장되는데, 이를 "bins"라고 한다. 할당자는 할당 요청을 충족시키기 위해, 적합한 청크를 bins에서 신속하게 찾아 재할당한다. 종류 : Fast bin, Small bin, Large bin, Unsorted bin 2. Fast bin "fastbin"에 포함되는 chunk크기의 범위는 0 ~ 80*sizeof(size_t)/4까지이다. M_MXFAST(1)라는 매개변수를 사용해서 "fastbin"에 포함되는 chunk 범위를 설정한다. "fastbin"의 기본 범위는 0 ~ 64*sizeof(size_t)/4이다. 32bit : 64byte (64 * 4/4) 64bit : 128byte (64 * 8/4) 해당 크기보다 ..
Malloc(1) - chunk (glibc의 ptmalloc2) 1. Memory Allocator 메모리 관리를 위해 사용되는 Allocator에는 dlmalloc, ptmalloc2, jemalloc, tcmallc, libumem 등 다양한 종류의 메모리 할당자가 존재한다. 본 글에서는 "GNU C Library"의 메모리 할당자인 ptmalloc2에 대한 내용이다. 1-1. ptmalloc2 dlmalloc코드를 기반이고 멀티 스레드에서 사용되도록 확장되었다. 한 번에 두 개 이상의 메모리 영역을 활성화하여, 멀티 스레드 애플리케이션을 효율적으로 처리할 수 있다. 복수 스레드가 동시에 malloc을 호출하면, 각 스레드는 별도의 힙 세그먼트가 생성되고 해당 힙을 유지 보수하는 데이터 구조도 분리되어 메모리에 할당된다. 즉, ptmalloc2를 사용하면 서로 다..
Fake EBP 1. Fake EBP란? IP(Instruction Pointer)를 조작하는 공격 기법을 말한다. leave-ret Gadget을 이용하여, 조작할 수 있다. 2. Fake EBP는 언제 사용? RET를 스택주소나 라이브러리 주소로 덮어쓸 수 없을 경우에 사용되는 기법이다. 3. Fake EBP 기법 공부 전, 알고 가기 함수 에필로그에 대해서 알고 있어야 한다. (본 글에서는 함수 에필로그에 대해 자세한 설명을 포함하고 있지 않으며, 알고 있는 것으로 가정하여 작성되었다. ) 함수 에필로그는 함수의 끝을 의미하며, 이는 아래 코드로 구성되어 있다. leave ret leave의 내부 코드는 아래와 같다. mov esp, ebp pop ebp ret 내부 코드는 아래와 같다. pop eip jmp ei..
RTC (Return To CSU) 1. 정의 _ _libc_csu_init() 함수의 일부 코드를 Gadget으로 사용하는 기법이다. gadget이 모자라거나 없는 경우, RTC기법을 사용한다. 2. _ _libc_csu_init() 함수 정의 프로그램 실행 시, _init() 함수와 _ _preint_array, _ _init_array에 설정된 포인터를 읽어서 함수를 호출한다. 3. _ _libc_csu_init에 존재하는 Gadget _ _libc_csu_init()에서 가젯으로 사용하는 부분이다. ① Gadget 1 RBX, RBP, R12, R13, R14, R15 레지스터에 값을 저장할 수 있다. ② Gadget 2 Gadget 1에서 저장한 레지스터를 이용해서 함수의 인자값으로 전달한다. R13, R14, R15 레지스터에 ..
RTL (Return to Library) 1. NX 우회방법 NX로 인해 공격자가 버퍼에 주입한 쉘코드 실행은 어렵지만, 스택 버퍼 오버플로우 취약점으로 반환주소를 덮는 것은 여전히 가능하다. 공격자는 실행 권한이 남아있는 코드 영역으로 반환주소를 덮는 공격기법으로 NX를 우회할 수 있다. 2. 프로세스에 실행권한이 있는 메모리영역 ① 바이너리의 코드 영역 ② 바이너리가 참조하는 라이브러리의 코드 영역 3. 정의 NX를 우회하는 공격기법이다. libc 함수들로 NX를 우회하고 쉘을 획득하는 공격기법을 "Retrun To Libc"라고 한다. 다른 라이브러리로 공격에 활용될 수도 있으므로 "Return To Library"라고도 한다. 4. Return to PLT 정의 ASLR이 걸려 있어도 PIE가 적용되어 있지 않다면, PLT의 주소는 고정..
PLT & GOT 1. 라이브러리 정의 자주 사용하는 함수들의 정의를 묶어서, 하나의 라이브러리 파일로 만들고 이를 프로그램이 공유해서 사용할 수 있도록 지원하는 것이다. 같은 함수를 정의해야 하는 일이 줄어들음으로써, 코드 개발의 효율이 높아진다는 장점이 있다. 2. C언어의 라이브러리 C의 표준 라이브러리는 libc이며, 우분투에 기본적으로 탑재되어있다. (실행환경에서는 /lib/x86_64-linux-gnu/libc-2.27.so에 존재한다.) 프로그램에서 공통으로 사용하는 함수 중 C언어의 대표적인 것은 printf, scanf, strlen, memcpy, malloc 등의 함수가 존재한다. 라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 구분된다. 3. 표준 라이브러리의 경로를 확인 명령어 $ ld --v..
NX & ASLR 1. ASLR 정의 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다. 커널에서 지원하는 보호 기법으로, 아래와 같은 명령어로 확인할 수 있다. $cat /proc/sys/kernel/randomize_va_space 2 0 (No ASLR) : ASLR을 적용하지 않는다. 1 (Conservative Randomization) : 스택, 힙, 라이브러리, vdso 2 (Conservative Randomization + brk(2) : 1의 영역과 brk로 할당한 영역 2. ASLR 특이점 코드 영역의 main함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경된다. ASLR이 적용됐을 때, 파일을 페이지 단위로 임의 주소에 매핑한다. 이로 인해 페이지의..