Hacking/Pwnable

tcache duplication1. tcache?1. tcacheglibc 2.26 부터 tcache 가 도입되면서 0x20 ~ 0x410의 크기의 청크는 main arena가 아닌 tcache에서 관리되기 시작했다tcache는 크기별로 최대 7개까지 저장할 수 있고 가득 찬 이후에는 청크가 fastbin이나 다른 bin으로 이동하게 된다tcache는 보안 검사가 많이 생략되어 있어 공격자들에게 힙 익스플로잇 도구로 사용된다 glibc 2.27 의 tcache 는 double free에 대한 검증 로직이 없는 것으로 알려져 있지만실습 환경인 glibc 2.27 의 버전은 Ubuntu GLIBC 2.27-3ubuntu1.6 으로 이후 버전에서 도입된 검증 로직이 적용되었다→ 사실상 glibc 2.26 까..
DFB(Double Free Bug)1. Double Free bug?Double Free Bug는 동일한 청크를 중복으로 해제할 때 생기는 버그이다 libc tcache 없음, free된 메모리는 fastbin에 저장한다같은 청크를 두 번 free하면 fastbin에 중복 삽입할 수 있다→ Double Free Bug를 직접적으로 활용 가능하다 libc 2.26 ≤ libc tcache가 도입되고 free된 메모리는 먼저 tcache에 저장한다tcache는 중복 삽입을 허용하므로 Double Free Bug를 그대로 사용할 수 있다→ tcache poisoning 기법이 주요 공격 방식이다 libc ≥ 2.29 tcache에 대한 Double Free 방어가 도입되어 중복 삽입을 차단한다 Doub..
UAF (Use After Free)1. UAF ?1. UAFUAF (Use After Free)는 해제된 메모리에 접근할 수 있을 때 발생하는 취약점을 말한다 malloc 과 free 함수는 메모리의 데이터를 초기화 하지 않는다그래서 새롭게 할당한 청크를 명시적으로 초기화 하지 않으면 메모리에 남아있던 데이터가 유출되거나 사용될 수 있다 2. 발생 조건메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화 하지 않는 경우해제한 메모리를 초기화 하지 않고 다음 청크에 재할당 하는 경우glibc 2.27 이하의 버전에서 발생 3. Dangling pointerDangling 포인터는 유효하지 않은 메모리 영역을 가리키는 포인터를 말한다 메모리를 동적 할당할 때는 포인터를 선언하고 그 포인터에 mal..
ptmalloc21. ptmalloc21. ptmalloc2 ?ptmalloc2 (pthread malloc 2) 는 Memory Allocator 이다리눅스에서 사용하고 있으며, Glibc 에 구현되어 있다 ptmalloc 의 구현 목표는 효율적인 메모리 관리이다메모리 낭비 방지빠른 메모리 재사용메모리 단편화 방지ptmalloc 의 메모리 관리 전략을 알아보자 2. 메모리 낭비 방지메모리 동적 할당과 해제는 매우 자주 일어나게 된다컴퓨터의 메모리는 한정적이기 때문에 매 번 새로운 메모리 공간을 할당할 수 없다 ptmalloc 은 메모리 할당 요청이 발생하면, 해제된 메모리 공간 중에 재사용할 수 있는 공간이 있는지 탐색한다해제된 메모리 공간 중에서 요청된 크기와 같은 크기의 메모리 공간이 있다면 그대로..
Stack Pivoting1. Stack Pivoting1. Stack Pivoting ?Stack pivoting 은 스택이 아니었던 공간을 스택처럼 사용하는 기법이다→ 익스플로잇을 하기 위한 공간이 부족할 때 새로운 스택 영역을 확보할 수 있다여러 가젯들을 이용해 쓰기 가능한 공간에 Fake Stack 을 구성하고 Chaining 한다특정 영역에 값을 쓸 수 있거나 값이 있는 경우 SFP 를 조작하여 스택을 옮기고 해당 부분의 코드를 실행한다 2. 전제 조건페이로드를 쓸 수 있는 영역이 존재하고, RET 까지만 overflow 가 발생할 때페이로드를 쓸 수 있는 영역이 없고, 입력함수 + leave_ret 을 넣을 수 있을만큼 overflow 가 발생할 때위의 두 경우 모두 가젯이 존재해야 한다 3...
SROP (Sigreturn-Oriented Programming) - x641. SROP이전 글에서 x86 아키텍처에 대한 SROP 방법을 알아보았다x64 아키텍처에서 확인해보자 기본적으로 x86과 x64 의 signal & signal handler 동작은 동일하다하지만 x64 환경이기 때문에 x86 레지스터와는 차이가 있다  2. Sigreturn1. sigcontextx64 환경에서는 sigreturn 시스템 콜이 호출되면, ucontext 구조체 안에 있는 sigcontext 를 기준으로 레지스터를 복원한다→ 유저 스택에는 ucontext 구조체가 먼저 들어가고 그 안에 sigcontext 가 포함되는 것이다 struct ucontext_x32 { unsigned int uc_flags; u..
SROP (Sigreturn-Oriented Programming) - x861. SROP ?Sigreturn Oriented Programming 으로 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장하고 원하는 시스템 함수를 호출하는 공격기법이다. SROP 를 알아보기 전에 시그널에 대해 알아보자  2. 시그널 (Signal) 1. 시그널 (Signal)운영체제는 크게 유저 모드(User Mode)와 커널 모드(Kernel Mode) 로 나뉘어진다. 유저 모드(User Mode)일반 프로그램이 실행되는 제한된 권한의 모드하드웨어 직접 접근 불가중요한 시스템 자원 접근 제한됨커널 모드(Kernel Mode)운영체제 핵심 코드가 실행되는 특권 모드모든 하드웨어와 시스템 자원에 접근 가능..
OOB (Out of Bound) 취약점1. Out of bound1. 배열배열이 사용하는 공간의 크기는 요소의 개수와 자료형의 크기를 곱한 값이 된다배열이 포함하는 요소의 개수를 배열의 길이라고 한다배열의 각 요소는 배열의 주소, 요소의 인덱스, 요소 자료형의 크기를 이용하여 계산된다 OOB (Out of Bound)는 요소를 참조할 때 인덱스 값이 음수거나 배열의 길이를 벗어날 때 발생한다프로세스는 계산한 주소가 배열의 범위 안에 있는지 검사하지 않는다 사용자가 인덱스의 값을 임의로 설정할 수 있다면, 배열의 주소로부터 특정 오프셋에 있는 메모리의 값을 참조할 수 있다→ 이러한 취약점을 Out of Bound 라고 한다 2. 예제 코드// Name: oob.c// Compile: gcc -o oob ..
Off by one1. Off by oneOff-by-one 은 문자열의 범위 1byte 로 인해 발생하는 취약점이다 문자열의 마지막에는 반드시 NULL 값이 들어간다→ 배열에 문자열을 저장할 때는 반드시 NULL 값까지 고려해서 저장해야 한다 하지만 정해진 공간을 모두 문자열로 채우면, NULL 값은 SFP 를 침범하게 된다  2. 함수 에필로그1. leave함수의 마지막에는 leave 와 ret 명령이 있다mov esp, ebppop ebpleave 는 위와 같은 명령을 수행한다 leave 에서는 스택 포인터를 함수를 호출하기 이전의 주소로 되돌리는 작업을 한다 스택을 살펴보자mov esp, ebp 실행 전의 스택 상태는 위와 같다mov esp, ebp 를 실행하면 esp 가 ebp 가 가리키는 곳으..
PIE (Position Independent Executable)1. PIEPIE (Position Independent Executable) 란?전체가 위치 독립 코드(PIC) 로 이뤄진 실행 가능한 바이너리이다. 무작위 주소에 매핑되어도 실행 가능한 실행 파일이다.ASLR 이 코드 영역에도 적용되게 해주는 기술이다.→ ASLR 을 적용해도 코드 영역의 주소는 변하지 않는다. PIE 는 재배치가 가능하기 때문에,ASLR 이 적용된 시스템에서는 실행 파일도 무작위 주소에 적재된다. 반대로, ASLR 이 적용되지 않은 시스템에서는 PIE 가 적용된 바이너리라도 무작위 주소에 적재되지 않는다. 리눅스는 기본적으로 ASLR 이 적용된 상태이기 때문에PIE 가 적용되면 바이너리가 실행될 때마다 바이너리의 주소..
GunP4ng
'Hacking/Pwnable' 카테고리의 글 목록