Pada challenge ini, diberikan sebuah file ELF-64bit bernama fake_canary. Mari kita check halangan apa saja yang harus kita lewati. Ternyata hanya NX saja. Mari kita coba jalankan dulu. Ternyata, input ini saja yang diminta. Yasudah, mari kita coba buka programnya di ghidra. Disini terlihat ada function main. Disini terlihat, bahwa kita bisa memasukkan input sebanyak […]
Category: Binary Exploitation
[Imaginary CTF] – Eyes-on-stack
Pada soal kali ini kita diminta untuk jump ke function win. Judul soal pun sudah diberi hint untuk memerhatikan stack. Jadi, cara kerja stack itu adalah Last In First Out (LIFO) untuk lebih jelasnya ada pada gambar dibawah. Kita membutuhkan buffer, address dari function win, dan arguments untuk mendapatkan flagnya. Src : (The PWN realm. […]
[HSCTF2021] – Stonks
Pada challenge ini, diberikan sebuah file ELF bernama chal. Mari kita lihat, kesulitan apa saja yang harus kita hadapi di challenge ini? Jadi kita diberikan sebuah file ELF binary 64 bit, dengan Non-Executable Stack. Coba kita jalankan terlebih dahulu. Program ini meminta input di line kedua, yaitu setelah “symbol: “. Input yang penulis masukkan adalah […]
[Cyber Apocalypse CTF 2021] – System dROP
Check file
1 2 3 4 5 6 7 8 9 |
$ checksec ./system_drop [*] '/media/sf_CTF/HTB_Apocalypse/SystemdROP/system_drop' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) $ file ./system_drop ./system_drop: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=62fa734d6f39650844d0c069a26d06e655bf12b4, not stripped |
Reversing
1 2 3 4 5 6 7 |
int main(int argc, const char **argv, const char **envp) { char buf[24]; alarm(0xFu); read(0, &buf, 0x100); return 1; } |
Ada function yang menarik yaitu _syscall yang diberikan didalam codenya. Exploit Pikiran pertama kali muncul yaitu melakukan ret2csu dan srop. Ret2csu digunakan untuk menuliskan frame srop dan “/bin/sh” di dalam segment .bss . Srop digunakan untuk memanggil “/bin/sh”. Pada main function ada vulnerability buffer overflow. Dimana setelah return dapat melakukan […]
[Cyber Jawara 2020 Qualification] – Syscall
Pada soal ini, sesuai dengan deskripsi soal, kita diminta untuk melakukan syscall. Mari kita coba lihat isi netcat. Program memberikan address untuk alamat flag yang akan berubah setiap saat nc di eksekusi. Kemudian, program akan meminta input nomor syscall, kemudian argument yang diperlukan untuk syscall yang ingin dipanggil. Namun, terdapat beberapa syscall yang di blacklist. […]
[Cyber Jawara 2020 Qualification] – ROP
Pada soal ini, peserta tidak diberikan binary, melainkan hanya informasi mengenai binary yang berjalan di server. Dari informasi yang diberikan pada deskripsi soal, binary yang berjalan memiliki konfigurasi kurang lebih sebagai berikut: RELRO: Partial RELRO Canary: Disabled NX: Enabled PIE: No PIE Selain itu diberikan informasi dari file elf_info dimana kita dapat mengetahui architecture dari […]
[Angstrom CTF 2020] – canary
Diberikan sebuah binary dengan konfigurasi sebagai berikut: Berikut adalah list dari semua fungsi pada binary: Berikut adalah pseudocode dari fungsi yang memiliki celah:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
unsigned __int64 greet() { char format; // [rsp+0h] [rbp-60h] char v2; // [rsp+20h] [rbp-40h] unsigned __int64 v3; // [rsp+58h] [rbp-8h] v3 = __readfsqword(0x28u); printf("Hi! What's your name? "); gets(&format); printf("Nice to meet you, "); strcat(&format, "!\n"); printf(&format); printf("Anything else you want to tell me? "); gets(&v2); return __readfsqword(0x28u) ^ v3; } |
Dilihat program menggunakan gets() yang memiliki kelemahan buffer overflow dan printf(&format) memiliki kelemahan format string attack. Tujuan dari soal ini adalah untuk memanggil fungsi flag(). Namun dari nama soal dan konfigurasi binary, terdapat stack canary […]
[KKSI 2019] – Sandbox1
Diberikan sebuah binary dengan konfigurasi seperti di bawah Ketika binary dijalankan akan meminta input sebagai berikut. Dengan konfigurasi seperti tadi dan juga input beserta segfault, maka dapat dipastikan bahwa soal ini adalah soal shellcoding dan namanya mengacu pada shellcode sandbox. Untuk memahami bagaimana cara kerja program, kita lihat hasil disassembly nya. Bisa dilihat bahwa main functionnya […]
[PicoCTF 2019] – NewOverflow2
Diberikan sebuah binary dengan konfigurasi sebagai berikut: Berikut adalah list fungsi yang ada dalam binary: Jika kita lihat isi fungsi win_fn akan terlihat sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int win_fn() { int result; // eax@6 char s; // [sp+0h] [bp-40h]@4 FILE *stream; // [sp+38h] [bp-8h]@1 stream = fopen("flag.txt", "r"); if ( !stream ) { puts("'flag.txt' missing in the current directory!"); exit(0); } fgets(&s, 48, stream); if ( win1 && win2 ) result = printf("%s", &s); else result = puts("Nope, not quite..."); return result; } |
Untuk bisa mendapatkan flag, kita harus membuat fungsi win_fn1 dan win_fn2 menjadi true. Berikut isi dari kedua fungsi tersebut:
1 2 3 4 5 |
void __fastcall win_fn1(int a1) { if ( a1 == 0xDEADBEEF ) win1 = 1; } |
1 2 3 4 5 6 7 8 9 |
__int64 __fastcall win_fn2(int a1, int a2, int a3) { __int64 result; // rax@1 result = (unsigned __int8)win1; if ( win1 && a1 == 0xBAADCAFE && a2 == 0xCAFEBABE && a3 == 0xABADBABE ) win2 = 1; return result; } |
Disini terlihat bahwa untuk membuat value dari win1 […]
[PicoCTF 2018] – ropchain
Untuk soal ini, kita diberikan sebuah file binary dan source code C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <stdbool.h> #define BUFSIZE 16 bool win1 = false; bool win2 = false; void win_function1() { win1 = true; } void win_function2(unsigned int arg_check1) { if (win1 && arg_check1 == 0xBAAAAAAD) { win2 = true; } else if (win1) { printf("Wrong Argument. Try Again.\n"); } else { printf("Nope. Try a little bit harder.\n"); } } void flag(unsigned int arg_check2) { char flag[48]; FILE *file; file = fopen("flag.txt", "r"); if (file == NULL) { printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n"); exit(0); } fgets(flag, sizeof(flag), file); if (win1 && win2 && arg_check2 == 0xDEADBAAD) { printf("%s", flag); return; } else if (win1 && win2) { printf("Incorrect Argument. Remember, you can call other functions in between each win function!\n"); } else if (win1 || win2) { printf("Nice Try! You're Getting There!\n"); } else { printf("You won't get the flag that easy..\n"); } } void vuln() { char buf[16]; printf("Enter your input> "); return gets(buf); } int main(int argc, char **argv){ setvbuf(stdout, NULL, _IONBF, 0); // Set the gid to the effective gid // this prevents /bin/sh from dropping the privileges gid_t gid = getegid(); setresgid(gid, gid, gid); vuln(); } |
Untuk konfigurasi file binary masih sama seperti writeup ini. Dilihat dari source code C yang kita dapat, kita harus mendapatkan value true pada fungsi win1 dan win2 untuk bisa mendapatkan flag yang terdapat pada fungsi flag. Tapi permasalahannya ketiga fungsi tersebut tidak […]