Wargame/Dreamhack
basic_rop_x64
#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); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } 이 전 기본 문제에서는 주소를 하나하나 구해서 기입했지만, 이번에는 ELF 함수를 ..
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는 얻으면 되고, 이 문제의 ..
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..
[Lecture-System hacking] Quiz: x86 Assembly 1
a=[0x67,0x55,0x5c,0x53,0x5f,0x5d,0x55,0x10,0x44,0x5f,0x10,0x51,0x43,0x43,0x55,0x5d,0x52,0x5c,0x49,0x10,0x47,0x5f,0x42,0x5c,0x54,0x11,0x00,0x00,0x00,0x00,0x00,0x00] print(len(a)) for i in range(len(a)): print(chr(a[i]^0x30))