본문 바로가기

분류 전체보기

(66)
RTC (Return To CSU) 1. 정의 _ _libc_csu_init() 함수의 일부 코드를 Gadget으로 사용하는 기법이다. gadget이 모자라거나 없는 경우, RTC기법을 사용한다. 2. _ _libc_csu_init() 함수 정의 프로그램 실행 시, _init() 함수와 _ _preint_array, _ _init_array에 설정된 포인터를 읽어서 함수를 호출한다. 3. _ _libc_csu_init에 존재하는 Gadget _ _libc_csu_init()에서 가젯으로 사용하는 부분이다. ① Gadget 1 RBX, RBP, R12, R13, R14, R15 레지스터에 값을 저장할 수 있다. ② Gadget 2 Gadget 1에서 저장한 레지스터를 이용해서 함수의 인자값으로 전달한다. R13, R14, R15 레지스터에 ..
[Wargame] rop 해당 문제는 강의에 기반한 문제로, 자세한 풀이는 아래 주소를 참고하세요. 2022.07.02 - [Dreamhack/Lecture & Practice] - [Practice] ROP - GOT Overwrite 1. 실습 코드 // Name: rop.c // Compile: gcc -o rop rop.c -fno-PIE -no-pie #include #include int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Leak canary puts("[1] Leak Canary"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf..
[Practice] ROP - GOT Overwrite Ⅰ. ROP(Return Oriented Programming) 정의 리턴 가젯을 사용하여, 복잡한 실행 흐름을 구현하는 기법이다. 공격자는 이를 이용하여, 문제 상황에 맞춰 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성할 수 있다. ROP 페이로드는 리턴 가젯으로 구성되는데, RET단위로 여러 코드가 연쇄적으로 실행되는 모습에서 "ROP Chain"이라고도 부른다. Ⅱ. 실습 1. 실습 코드 // Name: rop.c // Compile: gcc -o rop rop.c -fno-PIE -no-pie #include #include int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0..
[Wargame] Return to Library 해당 문제는 강의에 기반한 문제로, 자세한 풀이는 아래 주소를 참고하세요. 2022.07.01 - [Dreamhack/Lecture & Practice] - [Practice] Return to Library 1. 실습 코드 // 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(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt"); // Lea..
[Practice] Return to Library 1. 실습 코드 // 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(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt'"); // Leak canary printf("[1] Leak Canary\n"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); // Overwrite r..
RTL (Return to Library) 1. NX 우회방법 NX로 인해 공격자가 버퍼에 주입한 쉘코드 실행은 어렵지만, 스택 버퍼 오버플로우 취약점으로 반환주소를 덮는 것은 여전히 가능하다. 공격자는 실행 권한이 남아있는 코드 영역으로 반환주소를 덮는 공격기법으로 NX를 우회할 수 있다. 2. 프로세스에 실행권한이 있는 메모리영역 ① 바이너리의 코드 영역 ② 바이너리가 참조하는 라이브러리의 코드 영역 3. 정의 NX를 우회하는 공격기법이다. libc 함수들로 NX를 우회하고 쉘을 획득하는 공격기법을 "Retrun To Libc"라고 한다. 다른 라이브러리로 공격에 활용될 수도 있으므로 "Return To Library"라고도 한다. 4. Return to PLT 정의 ASLR이 걸려 있어도 PIE가 적용되어 있지 않다면, PLT의 주소는 고정..
PLT & GOT 1. 라이브러리 정의 자주 사용하는 함수들의 정의를 묶어서, 하나의 라이브러리 파일로 만들고 이를 프로그램이 공유해서 사용할 수 있도록 지원하는 것이다. 같은 함수를 정의해야 하는 일이 줄어들음으로써, 코드 개발의 효율이 높아진다는 장점이 있다. 2. C언어의 라이브러리 C의 표준 라이브러리는 libc이며, 우분투에 기본적으로 탑재되어있다. (실행환경에서는 /lib/x86_64-linux-gnu/libc-2.27.so에 존재한다.) 프로그램에서 공통으로 사용하는 함수 중 C언어의 대표적인 것은 printf, scanf, strlen, memcpy, malloc 등의 함수가 존재한다. 라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 구분된다. 3. 표준 라이브러리의 경로를 확인 명령어 $ ld --v..
NX & ASLR 1. ASLR 정의 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다. 커널에서 지원하는 보호 기법으로, 아래와 같은 명령어로 확인할 수 있다. $cat /proc/sys/kernel/randomize_va_space 2 0 (No ASLR) : ASLR을 적용하지 않는다. 1 (Conservative Randomization) : 스택, 힙, 라이브러리, vdso 2 (Conservative Randomization + brk(2) : 1의 영역과 brk로 할당한 영역 2. ASLR 특이점 코드 영역의 main함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경된다. ASLR이 적용됐을 때, 파일을 페이지 단위로 임의 주소에 매핑한다. 이로 인해 페이지의..