Pada soal ini diberikan zip archive yang berisi direktori home linux pada umumnya.Pada direktori tersebut, terdapat beberapa file yang bisa menuntun kita pada flag: .bash_history: Menyimpan command-command yang pernah di eksekusi flag.zip: Berisi flag.txt pass.txt: Berisi password untuk zip file Hal pertama yang kami coba adalah langsung menggunakan isi file pass.txt untuk melakukan unzip terhadap […]
Author: ArkAngels
[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 […]
[Joints2020] – crackme
Diberikan sebuah binary 64 bit not stripped. Pseudocode dari fungsi main adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int __cdecl main(int argc, const char **argv, const char **envp) { char v4; // [rsp+0h] [rbp-30h] _BYTE v5[3]; // [rsp+5h] [rbp-2Bh] _BYTE v6[6]; // [rsp+Ah] [rbp-26h] int v7; // [rsp+14h] [rbp-1Ch] char v8; // [rsp+19h] [rbp-17h] unsigned __int64 v9; // [rsp+28h] [rbp-8h] v9 = __readfsqword(0x28u); __isoc99_scanf("%5c-%5c-%5c-%5c-%5c", &v4, v5, v6, &v6[5], &v7); v8 = 0; if ( checker(&v4) ) unlock(); else printf("Invalid serial key"); return 0; } |
Dilihat program meminta input sepanjang 25 karakter dan kemudian input akan diproses oleh fungsi checker() dan bila hasil dari checker() adalah true maka fungsi unlock() akan dipanggil. Berikut pseudocode dari fungsi unlock():
1 2 3 4 5 6 7 8 9 10 |
int unlock() { char i; // al FILE *stream; // [rsp+8h] [rbp-8h] stream = fopen("flag.txt", "r"); for ( i = fgetc(stream); i != -1; i = fgetc(stream) ) putchar(i); return fclose(stream); } |
Fungsi tersebut akan membuka file flag.txt pada server nc. Berikut pseudocode dari fungsi checker():
[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 […]
[CSAW CTF Qualification Round 2019] – baby boi
Diberikan sebuah binary, libc library, dan source code C:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv[]) { setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); char buf[32]; printf("Hello!\n"); printf("Here I am: %p\n", printf); gets(buf); } |
Dari konfigurasi binary ini, tiap poin mempunyai maksud tersendiri: Binary yang diberikan adalah 64-bit binary dan Not Stripped Partial RELRO: RELRO sendiri adalah singkatan dari Relocation Read-Only, dimana dalam hal ini yang digunakan adalah Partial RELRO yang berarti untuk Global Offset Table (GOT) dan Procedure […]
[Cyber Jawara 2019 Qualification] – Heejin
Diberikan sebuah web beserta source code. Link source code: https://drive.google.com/open?id=1cJPV4_bjRzMO_woqrx6_2vHp7UFsXzAY Berikut adalah source codenya (hanya diambil bagian modul fungsionalitas website saja):
[HackToday 2019 Qualification] – memepy
Note: Soal ini baru diselesaikan penulis setelah kompetisi selesai dan dapat sentilan clue dari tim lain. (Credits goes to who gave the writer clue) Clue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@app.route("/fetch/<key>") def fetch(key): key = b64decode(key) if not key.startswith(b"http://") and not key.startswith(b"https://"): return abort(404) code = _fetch(key) if code is None: return abort(404) code = code.replace('[', '').replace(']', '') code = '<pre>' + code + '</pre>' |
Diberikan sebuah web. Sepertinya web ini meminta input sebuah link. Tapi, dari clue yang diberikan, tidak terlihat bahwa karakter yang di replace merupakan untuk link URL. Dan dari judul soal sepertinya […]