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...
send_sig 문제풀이1. 취약점 확인먼저 checksec 명령어로 보호기법을 확인해보자[*] '/home/gunp4ng/project/SF/send_sig/send_sig' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) SHSTK: Enabled IBT: Enabledx64 아키텍처에 Partial RELRO, NX - bit 보호기법이 걸려있는 것을 알 수 있다 1. 어셈블리C코드가 주어지지 않고 바이너리 파일만 주어졌다main 함수가 없어서 obj..
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_one_000 문제풀이1. 취약점 확인먼저 checksec 으로 취약점을 확인해보자[*] '/home/gunp4ng/working/dreamhack/off_by_one_000/off_by_one_000' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Stripped: Nox86 아키텍처에 NX-bit, Partial RELRO 가 적용된 것을 볼 수 있다 1. C 코드#include #include #include #include #include char cp_na..
off_by_one_001 문제풀이1. 취약점 확인먼저 checksec 으로 취약점을 확인해보자[*] '/home/gunp4ng/study/SF/off_by_one_001/off_by_one_001' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Stripped: Nox86 아키텍처에 Partial RELRO 가 적용된 것을 확인할 수 있다 1. C 코드#include #include #include #include void alarm_handler(){ puts("TIM..
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 가 가리키는 곳으..