# BKCTF ## Checker ![](https://hackmd.io/_uploads/B1vRyJxah.png) Bài cho 2 file **main.lua**: ![](https://hackmd.io/_uploads/HyRGgklah.png) **checker.lua**: ![](https://hackmd.io/_uploads/S169e1e62.png) Đâ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 ![](https://hackmd.io/_uploads/H1lNUkgah.png) Nếu nhập sai flag thì chương trình sẽ hiện ra một MessageBox: ![](https://hackmd.io/_uploads/HyNct1lp2.png) Load vào ida32, hàm main: ![](https://hackmd.io/_uploads/ry06DkxT3.png) Hàm `sub_40468D` có sử dụng hàm `RaiseException()` để tạo lỗi chặn chúng ta debug ![](https://hackmd.io/_uploads/rJpZuygT2.png) 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` ![](https://hackmd.io/_uploads/SJHt3kx62.png) Mình dùng `MakeCode` ida 1 lúc thì trông hàm main ở chế độ Graph như này :)))) ![](https://hackmd.io/_uploads/r1JUhJea2.png) 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: ![](https://hackmd.io/_uploads/HkxgjaJl6n.png) 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: ![](https://hackmd.io/_uploads/HJk-zleT2.png) ![](https://hackmd.io/_uploads/Byemfgl62.png) 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 : ![](https://hackmd.io/_uploads/BJ31Qxean.png) ![](https://hackmd.io/_uploads/ryovKllTh.png) Cipher lưu vào `0x4218b0`, sau đó được dùng để so sánh với đoạn flag được xor ban đầu: ![](https://hackmd.io/_uploads/Hkrnvela2.png) 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??} ```