본문 바로가기

DreamHack: System Hacking/F Stage 7

(5)
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 ..