본문 바로가기

PLT

(5)
[Lecture] RELRO (RELocation Read-Only) 1. lazy binding 함수가 처음 호출될 때, 함수의 주소를 구하고 GOT 테이블에 업데이트하는 것을 의미한다. 이는 바이너리가 실행 중에 GOT테이블을 업데이트할 수 있는 쓰기 권한이 있어야 가능하다. 2. ELF의 데이터 세그먼트 프로세스 초기화 및 종료와 관련된 .init_array, .fini_array가 존재한다. .init_array, .fini_array는 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있다. 이에 해당 위치에 공격자가 임의로 값을 쓸 수 있다면, 프로세스의 실행 흐름을 조작할 수 있는 것이다. 이러한 문제점을 해결하고자, 프로세스의 데이터 세그먼트를 보호하는 "RELRO (RELocation Read-Only)"를 사용한다. 3. RELRO 쓰기 권한이 불..
[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..