Hacking/Pwnable

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 가 적용되면 바이너리가 실행될 때마다 바이너리의 주소..
PIC (Position-Independent Code)1. PIC ?리눅스에서 ELF 는 실행파일(Executable)과 공유 오브젝트(Shared Object, SO) 로 2가지가 있다.실행파일 : 일반적인 실행파일공유 오브젝트 : 라이브러리 파일공유 오브젝트는 재배치(Relocation)가 가능하도록 설계되어 있다.재배치는 메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않는 것을 의미한다. 재배치가 가능한 코드를 Position-Independent Code (PIC) 라고 한다.  2. 정적 라이브러리 (Static  Link Library)1. 정적 라이브러리정적 라이브러리(Static Library) 는 프로그램 컴파일 시 Linking 단계에서라이브러리가 제공하는 코드를 복사하여 실..
가젯 찾는 법1. 가젯?1. 가젯이란?메모리에 존재하는 명령어를 얘기한다.ret 로 끝나고, 공유 libc 나 바이너리 안에 존재한다. x86 에서는 pop 을 이용해 esp 값을 조정해 호출할 인자수를 조정한다.x64 에서는 pop rdi, pop rsi 등의 레지스터를 이용해 인자를 전달한다. 2. x64 가젯x64 환경에서는 rdi, rsi, rdx, rcx, r8, r9 의 순으로 인자를 전달한다.따라서 pop rdi, pop rsi, pop rdx 같은 함수의 인자 순서에 맞는 레지스터를 찾아야 한다. 가젯을 찾는 방법을 알아보자  2. objudmp 명령어objudmp -d "파일명" | egrep "가젯" -d 는 파일을 디스어셈블 할 때 사용하는 옵션이다. objdump 로 가젯을 찾을 수..
ROP (Return Oriented Programming)1. ROP 이전 글은 x86 아키텍처에서의 페이로드였다.x64 아키텍처에서의 페이로드를 알아보자 x86 은 함수의 주소 + 가젯 + 인자의 순서였다.x64 는 가젯 + 인자 + 함수의 주소 순서이다. 그리고 x86 아키텍처는 인자를 스택에 저장해서 전달하지만 x64 는 레지스터로 전달하기 때문에 가젯의 레지스터가 중요하다. 2. 익스플로잇 구성1. 코드 확인// Name : rop.c// Compile : gcc -o 64rop 64rop.c -mpreferred-stack-boundary=4 -fno-pic -no-pie -fno-stack-protector#include void tools(){ asm ( "pop %rd..
GunP4ng
'Hacking/Pwnable' 카테고리의 글 목록