분류 전체보기
rop
// 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); // Do ROP puts("[2] Input ROP payload"); printf("Buf: "); read(0, buf, 0x100); return 0; } 앞선 문제와 동일하게 canary는 얻으면 되고, 이 문제의 ..
plt와 got
특정 함수를 실행시키고자할때 plt를 써야하나? got을 써야하나? libc로 로드된 함수 주소를 써야하나? 아니면 모두 상관 없나? 2022-07-22 clear got에 대한 이해가 부족했다. 정리해보자면 동적 링크, 정적링크부터 이해해야하는데, 차이라면 해당 함수가 프로그램에 포함되느냐 마느냐이다. 동적 할당은 프로그램에 포함되지 않고, 각 함수의 offset 만 기억하고 있으며, 정적할당은 프로그램에 포함되어버리는 것이다. 그래서 동적 할당 시 각 함수의 위치를 찾을 수 있는 명령어들이 해당 함수 call 시 포함된다. 이때 쓰이는 것이 plt와 got. plt는 got에 실제 함수의 위치를 넣어주는 역할을 하고 got는 실제 함수의 위치를 담고있는 역할을 한다. 이를 gdb로 확인해보면 우선 프..
64bit system 함수 segmentation fault 오류
system 함수로 익스플로잇 시 간혹 제대로 코드를 작성하였음에도 불구하고 segmentation fault 오류가 발생하는 경우가 있다. 1. 왜 그런지 알아보고 2. ret gadget 추가 시 왜 작동되는지 알아보자. 2022.07.19 당일 clear. 왜 그런지 알아보고 system 함수 내에 movaps 명령어가 있기 때문. movaps = mov aligned packed values이며 한번에 데이터를 다량으로 옮길때 사용되며 그 크기는 16 byte이다. 그래서 데이터들이 16byte로 묶을 수 있는가를 확인하기 때문이다. ret gadget 추가 시 왜 작동되는지 알아보자. movaps로 16 byte씩 묶인다고 가정했을때 seg. fault가 뜬다는 것은 8 byte의 남는 (또는 ..
Return to Library
// 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 return addr..
Return to Shellcode
#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { char buf[0x50]; init(); 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 '%s'\n", buf); puts("[2] Overwrite ..
ssp_001
이번 문제는 SSP 방어기법, 즉 canary가 보호기법으로 걸려있는 문제이다. 이를 우회하기위해서는 memory leak이 발생한다면 이를 활용해서 canary를 확인하는 방법이 최선이며, 그게 아니라면 브루트포싱해야한다. 코드를 조금 분석해보자. #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");..
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; } 앞선 문제와 다르게 이번에는 gets로 문자열을 입력받는다. 또한 read_flag ..
basic_exploitation_000
서버에 접속해서 실제로 값을 넣어보면 접속 시마다 buf의 주소가 변경되는 것을 보아 ASLR 즉, 랜덤 스택 보호 기법이 걸려있음을 알 수 있다. ┌──(kali㉿kali)-[~/Downloads/1] └─$ nc host3.dreamhack.games 13445 buf = (0xfff4d778) a ┌──(kali㉿kali)-[~/Downloads/1] └─$ nc host3.dreamhack.games 13445 buf = (0xffa4f748) a 코드를 보면 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _ION..
Return Address Overwrite
lecture와 연계된 기본적인 bof 문제이다. // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #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 함수가 있..
shell_basic
recture와 연계된, open, read, write 함수를 사용한 shellcode를 만드는 문제이다. 사실 lecture를 참고하면 flag file 경로만 hex 값으로 수정하여 사용할 수 있도록 예제가 잘 만들어져 있다. 다만 참고할만한 사항은 system call 부분인데, 간단히 이야기하자면 system call의 경우 특정 함수가 실행될 때 매번 특정 파일에서 해당 함수를 직접 찾기에는 다소 시간이 오래 걸릴 수 있고 비 효율적이기에 번호로 함수를 정의해두어 이를 해결하는 것이다. 원본 파일은 unistd.h이며 header 파일마다 조금씩 다르기에 사용된 header 파일을 정확히 알아야 한다. ┌──(kali㉿kali)-[~] └─$ cat /usr/include/x86_64-linu..