본문 바로가기

DreamHack: System Hacking

(45)
hook 소스코드 // gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { long *ptr; size_t size; initialize(); printf("stdout: %p\n", stdout); printf("..
[함께 실습] Hook Overwrite 개념 1) Full RELRO(O) 이더라도 -> libc의 데이터 영역에는 쓰기 권한(O) 2) malloc 함수 -> __malloc_hook 변수의 값이 NULL이 아닌지 검사 -> NULL(X) -> __malloc_hook이 가리키는 함수를 먼저 실행. -> 이때, malloc 함수의 인자는 훅 함수에 전달된다. 위의 내용은 훅 변수를 사용하는 free, realloc도 마찬가지 3) 위의 함수(malloc, free, realloc)들은 libc.so에 정의돼있음. $ readelf -s /lib/x86_64-linux-gnu/libc-2.27.so | grep -E "__malloc_hook|__free_hook|__realloc_hook" 를 통해 확인해보면 __free_hook, __ma..
PIE & RELRO PIE [PIE(Position-Independent Executable)]: ASLR이 코드 영역에도 적용되게 해주는 기술. 무작위 주소에 매핑돼도 실행 가능한 실행 파일 -ASLR 환경에서 PIE가 적용된 바이너리 -> 실행될 때마다 다른 주소에 적재된다. 따라서, 코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 -> 바이너리가 적재된 주소를 알아야 한다. [ELF]: 실행 파일 or 공유 오브젝트(ex. libc.so) [PIE 우회] a) 코드 베이스 구하기 b) Partial Overwrite: **** 키워드 **** -상대 참조(Relative Addressing): 어떤 값을 기준으로 다른 주소를 지정하는 방식 -Position Independent Code (PIC): 어떤 주소..
basic_rop_x86 [소스코드] #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } [exploit] *유념할 점: x64 아키텍처에서는 함수의 인자를 레..
basic_rop_x64 [소스코드] #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } [exploit] from pwn import * arch p = pr..
[함께 실습] Return Oriented Programming [Remind] 1) plt에는 got엔트리의 주소가 적혀있고 got에는 해당 함수의 실제 주소가 적혀있다. 2) ASLR이 적용되면 실행할 때마다 스택, 힙, libc_base의 주소가 바뀐다 [소스 코드] #include #include int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Leak canary puts("[1] Leak Canary"); write(1, "Buf: ", 5); read(0, buf, 0x100); printf("Buf: %s\n", buf); // Do ROP puts("[2] Input ROP payload"); write(1, "Buf: ", 5); r..
[함께 실습] Return to Library [Return to Library] -개념: NX 보호기법을 우회하기 위한 공격기법. 프로세스에 실행 권한이 있는 "바이너리의 코드 영역" & 바이너리가 참조하는 "라이브러리의 코드 영역"을 이용하여 공격. "라이브러리"에는 system, execve와 같은 함수들이 구현되어 있으므로, 이와 같은 함수들을 이용하여 NX를 우회하고 셸을 획득하는 것이 목적이다. [소스코드 분석(rtl.c)] // Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #include #include const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(s..
ASLR, NX & Static-Link, Dynamic-Link ASLR & NX [ASLR(Address Space Layout Randomization)] 메모리를 무작위 주소에 할당하는 보호 기법. 최신 커널들은 대부분 적용되어 있음. 리눅스에서는 페이지 단위로 할당이 이루어지므로 'libc_base'와 'printf'등 함수의 하위 12비트는 변하지 않는다는 특징이 있음. 또한, ASLR이 적용되어도 PIE가 적용되어 있지 않다면, "데이터 세그먼트(plt, got ∈ 데이터 세그먼트)", "코드 세그먼트"의 주소는 고정되어있음. [NX(No-eXecute bit)] 프로세스의 각 세그먼트에 필요한 권한만 부여하는 보호 기법. 일반적으로 코드 영역에는 읽기와 실행을, 나머지 영역에는 읽기와 쓰기 권한이 부여됨. Static Link & Dynamic Link ..