bof 풀다보니 기억이 새록새록 나서 그냥 RTL 진행하기로 했다.
스택이 실행 불가능하게(NX bit) 설정되어 있어 쉘코드를 삽입할 수 없는 상황에서 사용하는 대표적인 공격 기법이다.
system() 함수 같은 libc 함수를 호출하여 쉘을 획득한다.rtl 바이너리 파일, rtl.c 소스 코드 두개가 존재한다.
따라서, 바로 소스 코드부터 확인해보겠다.
// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
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 return address
printf("[2] Overwrite return address\\n");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
전체 소스코드는 이런식이고, 취약점이 있는 곳이나 공격 기법을 정하는 부분 위주로 분석을 진행하겠다.
const char* binsh = "/bin/sh";
“/bin/sh” 의 존재 확인 → ROP가 아닌 일반 RTL이라고 유추 가능( system(”/bin/sh”) 사용 가능) char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
buf: 사용자 입력을 저장할 스택 버퍼