# BKCTF
## Checker

Bài cho 2 file
**main.lua**:

**checker.lua**:

Đây là file `Lua byte code 5.4`
Mình dùng tool [này](https://sourceforge.net/projects/unluac/) để decompile file `checker.lua` thì được chương trình như này:
```lua=
local flag = {}
function flag.check(flag, v3)
local v4 = true
local bkctf2023 = string.lower(v3)
local data1 = {
46,
106,
119,
140,
105,
195,
195,
219,
180,
116,
151,
68,
191,
86,
169,
205,
195,
211,
107,
120,
110,
129,
160,
189,
189,
189,
194,
164,
102,
110,
123,
111
}
local data2 = {
219,
117,
231,
96,
201,
195,
228,
201,
255,
228,
195,
252,
219,
234,
213,
138,
138,
138,
96,
240,
228,
207,
195,
249,
207,
96,
261,
195,
219,
252,
99,
30
}
if 32 ~= #flag then
v4 = false
end
for v8 = 1, #data2 do
io.write(string.char(data2[v8] / 3))
end
for v9 = 1, #flag do
local v10 = flag:byte(v9) ~ bkctf2023:byte((v9 - 1) % #bkctf2023 + 1)
if v9 > 1 then
v10 = v10 + flag:byte(v9 - 1)
end
if data1[v9] ~= v10 then
v4 = false
end
end
return v4
end
return flag
```
Mình dùng `ChatGPT` Convert sang C:
```c=
int data1[] = {
46, 106, 119, 140, 105, 195, 195, 219, 180, 116, 151, 68, 191, 86, 169, 205, 195,
211, 107, 120, 110, 129, 160, 189, 189, 189, 194, 164, 102, 110, 123, 111
};
int data2[] = {
219, 117, 231, 96, 201, 195, 228, 201, 255, 228, 195, 252, 219, 234, 213, 138,
138, 138, 96, 240, 228, 207, 195, 249, 207, 96, 261, 195, 219, 252, 99, 30
};
int flag_length = strlen(flag);
if (32 != flag_length) {
v4 = 0;
}
for (int v8 = 0; v8 < sizeof(data2) / sizeof(data2[0]); v8++) {
printf("%c", data2[v8] / 3);
}
for (int v9 = 0; v9 < flag_length; v9++) {
int v10 = flag[v9] ^ bkctf2023[(v9 - 1) % strlen(bkctf2023)+1] + (v9 > 0 ? flag[v9 - 1] : 0);
if (data1[v9] != v10) {
v4 = 0;
}
}
```
### script
```python=
data = [ 46, 106, 119, 140, 105, 195, 195, 219, 180, 116, 151, 68, 191, 86, 169, 205, 195,
211, 107, 120, 110, 129, 160, 189, 189, 189, 194, 164, 102, 110, 123, 111]
flag =[None]*32
bk=b"bkctf2023"
flag[0]= data[0]^bk[0]
for i in range(1,len(data),1):
flag[i] = (data[i]-flag[i-1])^bk[i%len(bk)]
for i in flag:
print(chr(i),end="")
```
### flag
```
Lua_len_fl@g,Long_nang_lang_lang
```
## Reality
Bài cho mọt file PE32

Nếu nhập sai flag thì chương trình sẽ hiện ra một MessageBox:

Load vào ida32, hàm main:

Hàm `sub_40468D` có sử dụng hàm `RaiseException()` để tạo lỗi chặn chúng ta debug

Mình`xref` string `Wrong Flag :((` trong `MessageBox` vừa nãy thì thấy được đoạn code nằm ngay dưới hàm main, lướt lên 1 chút có rất nhiều `bytecode`

Mình dùng `MakeCode` ida 1 lúc thì trông hàm main ở chế độ Graph như này :))))

Xem ngay dưới hàm main có một đoạn code, dựa vào ida comment ta thấy `throw info for 'int'` xong ở dưới lại có `catch(int)` sau khi xử lý `Exception` xong chương trình sẽ tiếp tục ở đây:

Mặc dù mình thử `MakeCode` thật đẹp rồi nhưng cũng không tạo mã giả được, những lúc như này phải nhờ `BinaryNinja` để xem hàm này 1 cách tổng quan:


Cỏ vẻ hàm này chính là hàm check flag của chương trình, ta xem lại từ đầu, chương trình gọi hàm `sub_401220` với tham số là `input` và string`BKSEECCCC!!!`, hàm này sẽ xor 2 string này với nhau.
Ngay dưới là check [PEB!BeingDebugged Flag](https://anti-debug.checkpoint.com/techniques/debug-flags.html#manual-checks-peb-beingdebugged-flag). Nếu chúng ta không debug thì chương trình sẽ nhảy vào đoạn tạo cipher đúng :


Cipher lưu vào `0x4218b0`, sau đó được dùng để so sánh với đoạn flag được xor ban đầu:

Vậy ta chỉ cần lấy đoạn cipher trên xor lại với `BKSEECCCC!!!`
### script
```python=
data = [0x00, 0x00, 0x00, 0x00, 0x06, 0x38, 0x26, 0x77, 0x30, 0x58,
0x7E, 0x42, 0x2A, 0x7F, 0x3F, 0x29, 0x1A, 0x21, 0x36, 0x37,
0x1C, 0x55, 0x49, 0x12, 0x30, 0x78, 0x0C, 0x28, 0x30, 0x30,
0x37, 0x1C, 0x21, 0x12, 0x7E, 0x52, 0x2D, 0x26, 0x60, 0x1A,
0x24, 0x2D, 0x37, 0x72, 0x1C, 0x45, 0x44, 0x43, 0x37, 0x2C,
0x6C, 0x7A, 0x38]
string2 = b"BKSEECCCC!!!"
for i in range(len(data)):
print(chr(data[i]^string2[i%len(string2)]),end="")
```
### flag
{%hackmd @abc90/temp %}
{%hackmd @abc90/temp3 %}
```
BKSEC{e4sy_ch4ll_but_th3r3_must_b3_som3_ant1_debug??}
```