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..
함수 호출 과정(Runtime Resolve)1. Dynamic Link 시 함수 호출 과정1. PLT, GOT이전 글에서 짧게 설명하고 넘어갔던 Runtime Resolve 에 대해 자세히 알아보자 // Name : got.c//Compile : gcc -o got got.c -no-pie -fno-stack-protector -m32#include int main() { puts("Resolving address of 'puts'."); puts("Get address from GOT");}got.c 파일을 만들고 컴파일 한다. Dump of assembler code for function main: 0x08049176 : lea ecx,[esp+0x4] 0x0804917a ..
공유 라이브러리( PLT, GOT)1. 라이브러리란?1. 라이브러리(Library)프로그램은 공통으로 사용하는 함수들이 있다printf, scanf, strlen, memcpy, malloc 등 많은 함수들이 있다이러한 함수들의 정의를 묶어 만든 파일(오브젝트 파일)을 라이브러리라고 한다 C의 표준 라이브러리인 libc 는 우분투에 기본으로 탑재된 라이브러리다 2. Lazy Binding & Now BindingELF(Executable and Linkable Format)리눅스 기반 시스템의 기본 바이너리 형식 Lazy BindingDynamic Linking 방식으로 컴파일 된 바이너리에서함수를 처음 호출할 때 해당 함수의 주소를 공유 라이브러리에서 가져오는 것 Now Binding프로그램이 실행될..
NX-bit, ASLR1. NX-bit (No-eXecute-bit)1. NX-bit 란?Nx-bit (No-eXecute-bit) 는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법이다.메모리 영역에 쓰기 권한과 실행 권한이 함께 있으면 시스템이 취약해지기 쉽다. 코드 영역에 쓰기 권한이 있다면 공격자는 코드를 수정하여 원하는 코드를 실행할 수 있게 되고,스택 영역에 실행 권한이 있다면 Return to Shellcode 같은 공격을 시도할 수 있다. 즉, NX-bit 는 code 영역을 제외한 나머지 영역에 실행 권한을 넣지 않는 보호기법이다. 2. NX-bit 적용gcc 는 기본적으로 NX-bit 보호기법을 적용해서 컴파일한다.-z execstack따라서 Nx-bit..
스택 카나리 (Stack Canary)1. 스택 카나리1. 스택 카나리 (Stack Canary) 란?BOF 공격으로부터 반환 주소를 보호하기 위해 스택 카나리 (Stack Canary) 보호기법이 생겼다. 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다.카나리 값의 변조가 확인되면 프로세스는 강제로 종료 된다. BOF 공격에서 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로카나리를 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다. 2. 카나리 정적 분석1. 스택 카나리 비활성화// Name: canary.c#include int main() { char buf[8]; rea..