---
# System prepended metadata

title: KnightCTF 2024 Writeup
tags: [WriteupCTF]

---

**KnightCTF 2024**
===

## **Reverse Engineering**

### **Dragon's Binary**

![image](https://hackmd.io/_uploads/rJmVUa9YT.png)

Kiểm tra nhanh file này, mình thấy nó là file ELF cho Linux 64bit, nên mình dùng IDA để xem file này làm gì. Không tốn nhiều thời gian, mình tìm được hàm main khá nhanh.

![image](https://hackmd.io/_uploads/Hky4cp9K6.png)

Sau khi đọc qua hàm main, mình biết được hàm này đơn giản chỉ là nhận input vào, rồi so sánh với cả "letMeIn". Đơn giản trông nó sẽ thế này

![image](https://hackmd.io/_uploads/r1ZXiT9t6.png)

Để kiểm chứng xem cái mình làm có đúng không, mình đã chạy chương trình và thành công.

![image](https://hackmd.io/_uploads/S1G8ipct6.png)

Flag: letMeIn

### **Knight Armoury**

![image](https://hackmd.io/_uploads/r1uHUa5tT.png)

*!!! Note: Bài này debug sẽ ra nhanh hơn (Phân tích động)*

Kiểm tra nhanh file này, mình biết được file này là file ELF cho Linux 64bit. Nên mình đã dùng IDA để xem file này có gì. Không tốn nhiều thời gian cho việc tìm hàm main.

![image](https://hackmd.io/_uploads/S1H1hacKa.png)

Mình thấy ngay bước check, có gọi hàm "sub_401A5E", nên mình đã xem hàm này làm những gì.

![image](https://hackmd.io/_uploads/BJZznT9Fp.png)

1 hàm Boolean và kết quả trả về là so sánh giá trị truyền vào với "v2", "v2" thì được khởi tạo bởi hàm "sub_401A2E". Nên mình đã xem hàm này làm gì (Thật ra đoạn này debug sẽ nhanh hơn nma mình làm bài này theo phân tích tĩnh)

![image](https://hackmd.io/_uploads/B1M8n65Yp.png)

Thấy có gọi 1 string là "IaMaKnight" vào 2 hàm kia, nên mình đã kiểm tra 2 hàm làm gì

Hàm thứ nhất, không khó để nhận ra đây là ROT13

![image](https://hackmd.io/_uploads/rJyFn69YT.png)

Hàm thứ hai, thì đơn giản nó là ROT theo giá trị thứ 2 được truyền vào, và trong trường hợp này là 3

![image](https://hackmd.io/_uploads/HkWsh69tp.png)

Sau khi biết được cái thuật toán vừa rồi, mình sử dụng CyberChef để tìm cái thứ cần nhập vào

![image](https://hackmd.io/_uploads/HJf4aaqta.png)

Quay lại hàm main, thấy khi nhập đúng, sẽ thực hiện "cat flag.txt" nên mình đã tạo 1 flag fake để kiểm tra xem cái mình vừa tìm được nó có đúng không

![image](https://hackmd.io/_uploads/SJYcp6cFT.png)

Confirm được cái mình vừa tìm được là đúng. Bước cuối này chỉ là connect vào server bằng netcat và lấy flag thôi.

![image](https://hackmd.io/_uploads/SJnUd65KT.png)

Flag: KCTF{kN1gHT_aRm0uRy_aCC3ss_GranTed}

### **Saphira and the Valyrian Sword**

![image](https://hackmd.io/_uploads/r1yDLpct6.png)

Bài này mình vừa tìm được flag thì hết giải (y hệt như lần mình thi SVATTT2023, dù sao thì cũng giải được nên mình lên con writeup)

Kiểm tra nhanh, mình biết được file này là file ELF cho Linux 64bit, nên mình đã dùng IDA để xem file. Không tốn quá nhiều thời gian để tìm ra được hàm main

![image](https://hackmd.io/_uploads/SJf7RTqta.png)

Thì đơn giản là khi nhập đúng password, file này sẽ thực hiện việc "cat flag.txt". Và để thực hiện được, cần qua được bước kiểm tra input với "v13"

Tuy nhiên từ từ vào, nếu hàm main chỉ có thế thì khi chạy, sao nó lại in ra 1 đống text, nên mình đã ngồi tìm đống text đấy và tìm thấy

![image](https://hackmd.io/_uploads/r1DqAp9FT.png)

Sau 1 hồi debug, mình nhận ra hàm "sub_404EF0" sẽ lấy giá trị "USER" từ biến môi trường và in ra (hàm này đoạn sau cũng sử dụng nên mình mới nhắc đến tại đây).

![image](https://hackmd.io/_uploads/SJ3JyC5t6.png)

Và bên cạnh đó, cũng in ra cả giá trị thứ nhất được truyền vào (Cái này cũng có sử dụng đoạn sau nên mình nhắc đến tại đây).

![image](https://hackmd.io/_uploads/Sy74109Y6.png)

Để kiểm tra xem phân tích đúng không, mình đã chạy chương trình

![image](https://hackmd.io/_uploads/r1iL1Aqta.png)

Quay lại hàm main, thì thấy được giá trị đầu tiên được truyền vào là "v12"

![image](https://hackmd.io/_uploads/HJ_Y10cYa.png)

Nhìn có vẻ như là hàm rand với seed là 0, nhưng không quan trọng lắm vì nó đã in ra cho mình biết giá trị là gì. Vậy là xong đoạn đầu, giờ bắt đầu vào xem cái hàm check của nó (hàm "sub_402035")

![image](https://hackmd.io/_uploads/rkRTkC9Ya.png)

Tại đoạn return lại gọi thêm 1 hàm nữa mà

![image](https://hackmd.io/_uploads/HJ4-eC5tp.png)

Nhìn kinh khủng thật đấy. BUT I DON'T GIVE A FUCK.

Đoạn này mình chỉ code lại là xong rồi, không cần tìm hiểu kỹ xem nó làm những gì lắm (nghe kiểu script kiddies, noob player vl nhưng nó là sự thật)

![image](https://hackmd.io/_uploads/B1ew7GR5K6.png)

Script
```python
def cal2(x):
    x = int(x)
    v3 = 0
    while(x):
        v3 = v3 * 10 + x % 0xa
        x = x // 0xa
    return v3

def cal(user, numb):
    v3 = 0
    for c in user:
        v3 += ord(c)
    v2 = int(numb)
    v6 = 0
    v7 = 1
    while(v2 > 0):
        v5 = v2 % 10
        v2 = v2 // 10
        v6 += v7 * (v3 ^ v5)
        v7 *= 10
    return int(numb) ^ cal2(int(v6))

def main():
    user = str(input("USER: "))
    numb = int(input("NUMB: "))
    print(f"PASSWORD: {cal(user, numb)}")

if __name__ == '__main__':
    main()
```

Test trên local thành công, mình chỉ cần connect vào server bằng netcat và lấy flag thôi

![image](https://hackmd.io/_uploads/SJW2Dp9Yp.png)

Flag: KCTF{k1LL_tHE_Saphira_dRAgon_wITH_thE_sWORD}

## **Steganography**

### **Flag Hunt!**

![image](https://hackmd.io/_uploads/BJUqUTqtT.png)

Bước đầu mình cần làm, là crack password file zip

![image](https://hackmd.io/_uploads/r18MQA9tp.png)

Crack thành công, mình extract file và được kha khá file trong đó (1001 file ảnh và 1 file wav, 2 file txt)

![image](https://hackmd.io/_uploads/B1y_m05ta.png)

Đầu tiên mình đọc file "n0t3.txt"

![image](https://hackmd.io/_uploads/BJdF7R9Yp.png)

OK, vậy là 1 bước nào đó, sẽ là dùng string ở lower

Tiếp tục là mình check file "nooope_not_here_gotta_try_harder.txt"

![image](https://hackmd.io/_uploads/rJf6mA5KT.png)

File này chỉ là cung cấp format flag thôi, không có gì cả. Tiếp theo mình xem file "key.wav" bằng Audacity

![image](https://hackmd.io/_uploads/rJR4NR9tT.png)

Đơn giản là morse code, nên mình thực hiện decode xem nó là gì

![image](https://hackmd.io/_uploads/SyJhE0qKp.png)

Lấy được đoạn string, và ở lower là "morsecodetotherescue!!". Tiếp theo là check file ảnh, trong trường hợp này mình check md5sum của các file ảnh và tìm ra impostor

![image](https://hackmd.io/_uploads/HJcvHAcFp.png)

Bằng biện pháp nghiệp vụ, mình biết được file này dùng steghide để thêm file nào đó vào, cùng đoạn text vừa lấy được. Mình thành công lấy được flag

![image](https://hackmd.io/_uploads/Sy2pSC9tp.png)

Flag: KCTF{3mb3d_53cr37_4nd_z1pp17_4ll_up_ba6df32ce}

### **Oceanic**

![image](https://hackmd.io/_uploads/rJljsI69F6.png)

Đầu tiên, mình kiểm tra file ảnh bằng exiftool và lấy được 1 đoạn text

![image](https://hackmd.io/_uploads/Sk9mLR9Y6.png)

Và cái này được encode base58 nên việc mình làm là decode nó thôi

![image](https://hackmd.io/_uploads/B1SL80cYa.png)

Lấy được đoạn text là "theoceanisactuallyreallydeeeepp"

Hmmmm, "deep"? Vâng, DeepSound. OK, vậy dùng DeepSound mở file thôi

![image](https://hackmd.io/_uploads/ByAJvC5KT.png)

Ah shiet, password? Mình thử nhập đoạn text vừa tìm được và hô hô hô, nó là password mà. Có 1 file flag.png ở đây

![image](https://hackmd.io/_uploads/HyofPR9tp.png)

Lấy nó ra và kiểm tra, mình có chạy lệnh strings và lấy được flag luôn (Chứ đúng ra sẽ là hmmm, đổi đuôi file sang jpg, xong dùng binwalk để extract file zip ở cuối file ra xong mở lên. Nhưng vì file zip không đặt password và file flag là file thuần text nên...)

![image](https://hackmd.io/_uploads/SJ8CPC9ta.png)

Flag: KCTF{mul71_l4y3r3d_57360_ec4dacb5}