Hacking

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..
ROP (Return Oriented Programming)1. ROP ?Return Orented Programming 으로 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 공격 기법이다.공격자는 보호기법에 맞춰 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성할 수 있다.  2. 익스플로잇 구성1. 코드 확인// Name : rop.c// Compile : gcc -o rop rop.c -m32 -mpreferred-stack-boundary=2 -fno-pic -no-pie#include void tools(){ asm ( "pop %edi;" "pop %esi;" "pop %ed..
RTL Chaning (x64)1. 함수 호출 방법1. 코드 확인// Name : rtl_chaning.c// Compile : gcc -mpreferred-stack-boundary=4 -fno-stack-protector -fno-pic -no-pie -o x64_rtl_chaning rtl_chaning.c#include void func1(int a) { printf("func1 val1: %d\n", a);}void func2(int b) { printf("fucn2 val2: %d\n", b);}int main(){ char buf[100]; read(0, buf, 200); printf("%s\n", buf); return 0;}read 함수에서 buf 이상의..
RTL Chaning (x86)1. RTL Chaning 이란?RTL 공격에서 RET 주소를 변조하여 하나의 라이브러리 함수를 호출했다.RTL Chaning 은 RTL 공격 기법을 응용하여 여러개의 라이브러리 함수를 호출하는 공격 기법이다.  2. 함수 호출 방법1. 코드 확인// Name : rtl_chaning.c// Compile : gcc -m32 -mpreferred-stack-boundary=2 -fno-stack-protector -fno-pic -no-pie -o rtl_chaning rtl_chaning.c#include void func1(int a) { printf("func1 val1: %d\n", a);}void func2(int b) { printf("fucn2 val..
RTL 1. RTL (Return to Library)1. RTL 이란?Nx-bit 보호 기법이 적용되면 code 영역을 제외한 영역에 실행 권한이 부여되지 않는다.즉, 스택에 실행 권한이 부여되지 않는다.그렇기 때문에 스택에 shellcode 를 넣고 RET 에 덮어씌워도 실행 권한이 없어 shellcode 가 실행되지 않는다.이를 우회하기 위한 기법이 Return to Library 이다. 프로세스에 실행 권한이 있는 메모리 영역은 바이너리의 코드 영역과 라이브러리의 코드 영역이다.우리가 사용하는 함수들은 (ex. printf) 모두 라이브러리에 들어있다.RTL 은 RET 에 라이브러리 함수를 덮어씌워 실행되도록 하는 공격 기법이다. 2. 함수 호출 과정 (x86)1. callme 호출 전// Nam..
RELRO1. RELRO (Relocation Read-Only)1. RELRO 란?RELRO 는 Relocation Read-Only 줄임말로,ELF 바이너리 또는 프로세스의 데이터 섹션을 보호하는 기술이다.즉 메모리가 변경되는 것을 보호하는 기술이다. RELRO 가 적용되면 GOT_Overwrite 공격을 막을 수 있다. RELRO 에는 크게 3가지 종류가 있다.FULL RELROPartial RELRONO RELRO//Name : relro.c#include #include int main(int argc, char *argv[]){ size_t *p = (size_t *)strtol(argv[1], NULL, 16); p[0] = 0x41414141; printf("RELRO TE..
GOT Overwrite1. GOT Overwrite1. GOT Overwrite 과정함수를 처음 호출하면 PLT 가 호출되고 PLT 는 GOT 로 점프한다. 첫 번째 호출이면 GOT 에 함수의 실제 주소가 쓰여있지 않아dl_resolve 함수가 실제 함수의 주소를 알아와 GOT 에 써준 뒤 함수를 호출한다. 두 번째 호출부터는 PLT 가 GOT 로 점프하여 함수의 실제 주소를 가져온다.이 때 PLT 는 GOT 에 적힌 주소를 검증하지 않고 가져온다. GOT 를 변조하게 되면 공격자가 원하는 함수를 실행할 수 있다.이러한 공격 기법을 GOT Overwrite 라고 한다. 2. GOT Overwrite 실습//Name : got.c//Compile : gcc -o got got.c -fno-stack-pr..
GunP4ng
'Hacking' 카테고리의 글 목록