---
# System prepended metadata

title: 'Tiêu đề: PE01 — Write-up'

---

**UTECTF_WRITEUP: PE01**

**Tác giả:** Huy36
**Team:** K2_2H

**Cuộc thi:**  UTECTF  | Reverse Engineering 

---

## Mô tả challenge

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

sau khi tải file main.exe và chạy thử ta thấy được chương trình bắt người dùng nhập vào 2 key, vậy công việc của chúng ta có thể đoán ra là tìm 2 key đúng để in được cờ


---

## Mục tiêu

* Tìm được 2 key chương trình yêu cầu để có thể nhận được flag có dạng `UTECTF{...}`

---

## Công cụ & Môi trường

* OS: Kali
* Công cụ: `IDA`

---

## Phân tích chi tiết (Step-by-step)

1. **Bước 1 — Thu thập thông tin**


```bash
kali@Huy:/mnt/d/ctf$ file main.exe
main.exe: PE32 executable (console) Intel 80386, for MS Windows, 13 sections
```
file là Windows PE 32-bit, kiến trúc x86 (32-bit), vì vậy phù hợp để dùng công cụ ida

2. **Bước 2 — Dịch ngược**
    
    * Ném vào ida ta dễ dàng thấy ngay tại hàm `init()`
    ![image](https://hackmd.io/_uploads/Byzz2YUixl.png)
    - Ở hàm này ta thấy người ra đề đã ngăn chặn việc chương     trình bị debug bằng cách dùng biến `result` để lưu giá     trị trả về từ hàm `IsDebuggerPresent()`
    - nếu phát hiện debug chương trình sẽ nhảy vào `main2()` (là giao diện giả nhầm đánh lừa) rồi tiếp tục nhảy vào `exit()` để kết thúc chương trình
    ![image](https://hackmd.io/_uploads/ByL9TF8sex.png)
    - Việc ta cần làm lúc này là đặt breakpoint ngay tại `test eax,eax` và thay đổi giá trị thanh ghi eax thành 0x0h
    ![image](https://hackmd.io/_uploads/ByHr0FIogl.png)



   * Sau khi thực hiện xong và tiếp tục debug chương trình sẽ nhảy đến hàm `main` thật sự, quan sát kĩ ta thấy:
   ![image](https://hackmd.io/_uploads/ryakPvLslx.png)
   chương trình in ra thông báo, nhận input từ người dùng và lưu vào key1 và key2, sau đó sẽ gọi hàm `check()`
   ![image](https://hackmd.io/_uploads/HkyYy9Lolx.png)
    -Ở đây mình thử nhập key1 là "123" và key2 là "456", cùng xem tiếp 2 key này sẽ được chương trình xử lí tiếp như thế nào
   * kiểm tra hàm `check()`:
    -- Hàm check nhận dữ liệu từ các biến toàn cục: ``a, b, c, aa, bb, cc, key1, key``
    -- Sử dụng các toán tử nạp chồng: ``operator*, operator+, operator-, operator==.``, sau khi xem thì đây chính là các hàm tính toán số lớn
    * Giờ tìm hiểu kĩ thêm hàm ``check`` sẽ làm những gì, trên ida cho phép chuyển sang mã giả C để dễ hiểu hơn:
    **a/**
    * Chương trình thực hiện việc copy qua các lệnh dưới hình, ở đây là v119 copy từ key2:
    ![image](https://hackmd.io/_uploads/S1o-7o8jeg.png)
    
    * sau đó chương trình dùng các toán tử được nạp chồng để bắt đầu tính toán
    ![image](https://hackmd.io/_uploads/SJrliKIogl.png)

        ``operator*(&v122, &v116, &v119);``
    -- v116 copy từ b 
    -- v119 copy từ key2.
    → v122= (b * key2) 
    
    ![image](https://hackmd.io/_uploads/ByKLcYLigx.png)

         ``operator*(&v113, &v107, &v110);``
         ``operator+(&v89, &v113, &v122);``
    -- v107 copy từ a
    -- v110 copy từ key1
    → v113 = a * key1
    → v89 = (a * key1) + (b * key2)
    
    **b/**
    ![image](https://hackmd.io/_uploads/rkUhWqUsex.png)

    ``operator*(v106, &v100, &v103);   // bb * key2``
    ![image](https://hackmd.io/_uploads/rk5zz9Usgg.png)

    ``operator*(v99, &v93, &v96);      // aa * key1``
    ``operator-(&v91, v99, v106);  //→ v91 = (aa * key1) - (bb * key2)``
    * Sau hai thao tác từ **a** và **b** chương trình sẽ đến phần so sánh quan trọng:
    ``v62 = operator==(&v107, &v110);   // (c == v89)``
    **c= a * key1 + b * key2**
    ``v62 = operator==(&v113, &v116);   // (cc == v91)``
    **cc= aa * key1 − bb * key2**
    
    * Vậy để in được kết quả ``Correct!`` và in được cờ ta phải thỏa cả hai phương trình trên, việc bây giờ bạn cần làm chỉ là dump dữ liệu từ các mảng **a, aa, b, bb và c, cc.**. Ở đây mình sẽ ví dụ cho việc dump mảng **a**
    * Double click vào biến a ta sẽ thấy : 
![image](https://hackmd.io/_uploads/r1VJc5Loel.png)
    Mảng a bắt đầu từ `8D71A0h` và kết thúc ở `8D721Ch`,tiếp tục double click vào ta sẽ thấy được dữ liệu trong mảng a
![image](https://hackmd.io/_uploads/rkv4Y5Uogl.png)
thực hiện tương tự với các mảng còn lại ta sẽ có đủ dữ liệu để tính toán được key1 và key 2
 



3. **Bước 3 — Khai thác**

   * Sau khi có đủ dữ liệu ta có thể viết một script python để giải hệ phương trình trên
   ![image](https://hackmd.io/_uploads/Sy19WuLoll.png)



4. **Bước 4 — Lấy flag**

   * Dùng 2 key trên vào chương trình và chờ đợi kết quả

    ![image](https://hackmd.io/_uploads/SkHQGOLixl.png)
    * Vậy là đã lấy được cờ :v 


---






