본문 바로가기

전체 글

(71)
[함께 실습] 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 ..
[혼자 실습] ssp_001 소스코드 // ssp_001 #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); } void get_shell() { system("/bin/sh"); } void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]); } void menu() { p..
Exploit Tech: Return to Shellcode 이번 게시글에서는 Canary를 우회하여 Return Address Overwrite를 통해 Shell을 획득하는 실습에 대해 다뤄볼 것이다. 소스코드 //소스코드명: r2s.c //파일명: r2s #include #include int main() { char buf[0x50]; printf("Address of the buf: %p\n", buf); printf("Distance between buf and $rbp: %ld\n", (char*)__builtin_frame_address(0) - buf); printf("[1] Leak the canary\n"); printf("Input: "); fflush(stdout); read(0, buf, 0x100); printf("Your input is..
Mitigation: Stack Canary Stack Canary란 1) 함수 프롤로그에서 스택 버퍼와 SFP 사이에 임의의 값음 삽임함 2) 함수의 에필로그에서 해당 값의 변조를 확인함 변조 확인(O) -> 프로세스 강제 종료 변조 확인(X) -> 프로세스 정상 종료 Canary가 적용돼있는 Canary.asm을 분석해보자 Canary.c #include int main() { char buf[8]; read(0, buf, 32); return 0; } Canary.asm 1 push rbp 2 mov rbp,rsp 3 sub rsp,0x10 4 mov rax,QWORD PTR fs:0x28 5 mov QWORD PTR [rbp-0x8],rax 6 xor eax,eax 7 lea rax,[rbp-0x10] 8 mov edx,0x20 9 mov ..
basic_exploitation_001 *풀이: 함수의 소스코드를 먼저 살표보자, 소스코드: #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); } void read_flag() { system("cat /flag"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0; } read_flag라는 flag를..
basic_exploitation_000 전체적인 스케치: scanf 함수를 통해 buf에 쉘코드를 삽입하고, 스택 버퍼 오버플로우를 통해 메인 함수의 return address를 buf의 시작주소로 옮겨, buf에 들어가있는 쉘코드를 실행시킴으로서 쉘을 획득하면 되는 문제이다. 다만 주의해야할 점은, 1) 쉘코드 작성시 scanf 함수는 'x09, x0a, x0b, x0c, x0d, x20'와 이 이후의 값들을 읽어들이지 못 하기 때문에, 이를 우회한 쉘코드를 이용해야한다 2) x86 아키텍처에서 실행되는 execve syscall이므로, x86-64 아키텍처와 들어가게 되는 인자의 레지스터가 다르다. 이는 아래의 사진을 참고하자 사진을 통해 x86(32bit) 아키텍처에서의 execve의 인자 레지스터로는 eax, ebx, ecx, edx가..
Exploit Tech: Return Address Overwrite(리턴 주소 변경 및 실습) 이번 글에서는 ret 주소를 버퍼 오버플로우를 통해 변경하는 실습을 함께 해볼 것입니다. 소스 코드: #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0; } 설명: 위의 소스 코드에는 shell을 실행시킬 수 있는 get_shell이라는 함수가 존재합니다. 이 취약점을 이용하여 메인함수의..