--- tags: re, my challenges --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # BKSec CTF 2021 - reversing challenges ## Amazing Description: *Do you like large integers? Do you like crypto? I love all of them.* [file](https://github.com/lanleft/CTF_Writeups/blob/master/4_BKSEC/Amazing/files/amazing) Category: `re + crypto` format: BKSEC{...} ### Solution Về re, challenge này mình dùng source có sẵn trên github là [tiny-bignum-c](https://github.com/kokke/tiny-bignum-c) để xử lý các số lớn Về crypto, mình sử dụng [Subset sum problem](https://en.wikipedia.org/wiki/Subset_sum_problem). [link](https://l0z1k.com/Low_density) là một ví dụ để solve problem này. ## Matryoshka-Doll ### Description ![dc](https://github.com/lanleft/CTF_Writeups/raw/master/4_BKSEC/Matryoshka-Doll/images/1.png) ### Solution Chall này mình lấy ý tưởng từ bài [Namep](https://github.com/lanleft/CTF_Writeups/tree/master/1_SVATTT20/Namep) của **ASCIS** final năm 2020 ### Flow `Code DLL` --> chuyển qua `shellcode` (mình dùng tool [này](https://github.com/hasherezade/pe_to_shellcode)) --> import vào phần `resource`--> code một chương trình `loader` để load resource trên ### Phân tích source code #### Load Resource Một chương trình đơn giản load shellcode từ resource ```C #include <iostream> #include <Windows.h> #include "resource.h" #include <shlwapi.h> #include <TlHelp32.h> int main() { // load resource HRSRC shellcodeResource = FindResource(NULL, MAKEINTRESOURCE(IDR_BIN011), L"bin01"); DWORD shellcodeSize = SizeofResource(NULL, shellcodeResource); HGLOBAL shellcodeResourceData = LoadResource(NULL, shellcodeResource); // run shellcode void* exec = VirtualAlloc(0, shellcodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); memcpy(exec, shellcodeResourceData, shellcodeSize); ((void(*)())exec)(); return 0; } ``` #### Obfuscate Mình dùng một opensource là *XorStr* ```C puts(xorstr("Input your flag: ").crypt_get()); scanf("%64s", &pt); if (strlen((char*)pt) != 64) { puts(xorstr("Wrong length of flag...\n").crypt_get()); return 0; } ``` #### Crypto Mình sử dụng thuật toán mã hóa AES với source code từ *tiny-AES-c* ```C AES_init_ctx_iv(&ctx, key, iv); AES_CBC_encrypt_buffer(&ctx, pt, 64); ``` ### Phân tích Binary #### 1. Dump file dll Mình làm hoàn toàn giống challenge **Namep** để có được file **DLL** #### 2. Xác định hàm bắt đầu trong file DLL Mình để ý rằng, các **file** khi được **compile** bằng *visual studio* ở mode **release** sẽ bị *optimize* rất là nhiều cộng thêm *strip* làm cho file *binary* rất khó để reverse (*obfuscate* nhiều vlu :v) Chương trình mình code, mà khi reverse mãi mình mới tìm được `main` luôn :< Nhưng mình nhận ra, sẽ có một đường đi chung (của các file được compile ở mode *release* ) để đến được hàm `main` (xử lý chính của chương trình mà mình cần tìm). Và nó sẽ đi như sau: Đầu tiên, mình sẽ đi đến `DllEntryPoint` của file dll này: ![2](https://github.com/lanleft/CTF_Writeups/raw/master/4_BKSEC/Matryoshka-Doll/images/2.png) IDA thường sẽ tìm được `DllEntryPoint` các các file dll còn tiếp...