---
# System prepended metadata

title: DEADLINE CTF

---

[](https://)

---
# DEADLINE CTF 
## Bài 1: F81E37E841D0B2C1D5738A7D60FD98BE

* Load vào IDA xem 

```
int __cdecl main(int argc, const char **argv, const char **envp)
{
    unsigned int i; // esi
    int j; // edi
    char *v5; // esi
    int v6; // ecx
    __int128 v8; // [esp+0h] [ebp-28h] BYREF
    int v9; // [esp+10h] [ebp-18h]
    int v10; // [esp+14h] [ebp-14h]
    __int16 v11; // [esp+18h] [ebp-10h]
    char v12[8]; // [esp+1Ch] [ebp-Ch] BYREF

    v8 = xmmword_4DB6E0;
    v9 = 0x467B6E60;
    v10 = 0x72686661;
    v11 = 0x457;
    sub_4C1020("Guest your flag. The flag will be of the form flag{[a-zA-Z0-9]+}\n");
    sub_4C1020("Enter your key:");
    for ( i = 0; i < 5; ++i )
    {
        sub_4C1050("%hhd", &v12[i]);
    }

    for ( j = 0; j < 0x1A; j += 2 )
    {
        v5 = (char *)&v8 + j;
        *v5 ^= v12[j % 5u];
        v6 = j;
        v5[1] ^= v12[v6 - 5 * ((unsigned int)&v5[1 - (_DWORD)&v8] / 5) + 1];
    }

    sub_4C1020("flag is : %s\n");
    return 0;
}
```

* Code đọc khá dễ hiểu sau đây e sẽ giải thích ngắn gọn lại :

    1. đầu tiên chương trình bắt đầu bằng việc hiển thị hai thông điệp trên màn hình cho người dùng.

    2. Người dùng được yêu cầu nhập một "key" từ bàn phím. Đoạn mã sử dụng một vòng lặp để đọc 5 giá trị số nguyên từ người dùng và lưu trữ chúng trong mảng v12.

    3. Sau đó, chương trình thực hiện một vòng lặp khác để thay đổi giá trị của một biến đặc biệt được khởi tạo trước đó là v8. Mỗi lần lặp, giá trị của v8 được thay đổi bằng phép XOR giữa một ký tự trong v8 và một phần tử tương ứng trong mảng v12. Điều này dẫn đến sự thay đổi của v8 theo một quy tắc nhất định.

    4. Cuối cùng, chương trình sẽ in ra output là flag

* Hai hàm `sub_4C1050` và `sub_4C1020` không cần quan tâm vì đơn giản có tác như `read` và `write` để đánh lừa mình.

* Chú ý vào chuỗi `("Guest your flag. The flag will be of the form flag{[a-zA-Z0-9]+}\n");` thì ta biết được 5 kí tự đầu của flag chắc chắn là `flag{` 

* sau khi debug chuong trình em nhận được giá trị trên vùng `xmmword_4DB6E0` là `bdnpQai|nufimnug`n{FafhrW`
* từ đây có thể xor để lấy giá trị ban đầu 

```
v8 = "bdnpQai|nufimnug`n{FafhrW"
flag = "flag{"
for i in range(len(flag)) : 
    print(ord(flag[i]) ^ ord(v8[i]))
```
* Sau khi chạy ta thu được như sau ![Screenshot 2024-02-04 180728](https://hackmd.io/_uploads/rkxNWxa5a.png)

* vào debugger của IDA để nhập thử 5 giá trị này vào 

![Screenshot 2024-02-04 181331](https://hackmd.io/_uploads/rkzO-ga5p.png)

* flag là `flag{easy_baby_challenge}`

## Bài 2 EZSUDOKU

* Load chall vào IDA ta thấy chương trình khá phức tạp không đơn giản như bài kia

![Screenshot 2024-02-04 181527](https://hackmd.io/_uploads/r1ElMepqT.png)

* Khi run thử file .exe thì chương trình sẽ hiện như sau: 

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

* Không có Input gì cả, vì vậy em quyết định debug thử bằng IDA .

* Trước khi debug thì hãy nhìn thử vào phần code dưới đây 

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

* Nhìn sơ qua thì ta biết được v27 chính là mảng chứa giá trị để in bẳng sudoku lúc nãy, Có vẻ như ta phải giải sudoku và debug để láy flag. Để nhanh chóng thì em dùng web `sudoku.com` để nhập và giải ma trận 

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

* Việc tiếp theo là cần sửa giá trị trong mảng giống như bảng giải này của web 

![Screenshot 2024-02-04 185057](https://hackmd.io/_uploads/SyTVcx6ca.png)
![Screenshot 2024-02-04 185104](https://hackmd.io/_uploads/Sk0N5xp5a.png)
* Em đặt breakpoint ở vị trí cuối mảng v27 và 1 cái ở `return`

![Screenshot 2024-02-04 185226](https://hackmd.io/_uploads/SJb9qepq6.png)

* Đây là các giá trị của ma trận, ta có thể đổi các giá trị bằng cách `change word` như sau

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

* Sau khi đổi ta sẽ lấy được flag 

![Screenshot 2024-02-03 151509](https://hackmd.io/_uploads/Synehga5T.png)





