---
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

### 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:

IDA thường sẽ tìm được `DllEntryPoint` các các file dll
còn tiếp...