---
# System prepended metadata

title: RE Time travel (KCSC)

---

# RE Time travel (KCSC)
## Challenges
![image](https://hackmd.io/_uploads/rJZqPywTR.png)
### Bước 1:
- Đề bài cho tôi một file `chall.exe` và `enc.txt`.
- Tôi đưa file `chall.exe` vào IDA 64 để kiểm tra.
![image](https://hackmd.io/_uploads/SJMsu1Pp0.png)
- Đây là mã của hàm `main`.
- Đọc sơ qua chức năng của hàm này sẽ lấy từng ký tự của chuỗi flag gốc thực hiện phép xor với giá trị của `rand()` và khỏi tạo `v3` là `seed`.
### Bước 2
- ![image](https://hackmd.io/_uploads/Sk3-FJDTA.png)
- Thấy rằng `v3` là giá trị trả về của hàm time64 nên ta chỉ có cách dựa vào các giá trị `rand()` cho trước để thực hiện brute force để tìm seed.
- Biết trước 5 ký tự đầu của flag là `KCSC{` ta sẽ chuyển sang byte `4B 43 53 43 7B` và xor với giá trị byte của 5 ký tự đầu của file `enc.txt` là `hh}Æ7` ta chyển sang byte `68 68 7D C6 37` sau khi thực hiện phép xor ta thu được 5 giá trị của hàm rand() đầu tiên.
 ```
value1 = 35
 value2 = 43
 value3 = 46
 value4 = 133
 value5 = 76
```
- Vì file `chall.exe` được viết bởi ngôn ngữ C nên tôi sẽ dùng C để thực hiện Brute force tìm seed.
```
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int target_values[] = {35, 43, 46, 133, 76};
    int num_values = sizeof(target_values) / sizeof(target_values[0]);

    for (unsigned int seed = 0; seed <= 0xFFFFFFFF; seed++)
    {
        srand(seed);
        int match = 1;

        for (int i = 0; i < num_values; i++)
        {
            if (rand() % 256 != target_values[i])
            {
                match = 0;
                break;
            }
        }

        if (match)
        {
            printf("Tìm thấy seed: %u\n", seed);
            break;
        }
    }

    return 0;
}

```
```
seed = 16777215
```
### Bước 3:
- Vì tôi kiểm tra chuỗi flag mã hóa gồm 74 ký tự nên tôi sẽ in ra 74 giá trị của hàm `rand()` đầu tiên và tôi gọi các giá trị đó là `key`.

```
key = [35, 43, 46, 133, 76, 190, 133, 141, 82, 152, 113, 152, 251, 119, 137, 119, 47, 180, 142, 115, 88, 26, 240, 204, 15, 248, 148, 101, 244, 117, 213, 189, 221, 36, 201, 33, 52, 216, 197, 32, 154, 186, 35, 64, 208, 152, 66, 239, 216, 128, 207, 188, 87, 142, 67, 199, 62, 2, 173, 118, 169, 149, 178, 106, 8, 14, 210, 178, 124, 16, 237, 62, 132, 54]
```
- Bây giờ tôi sẽ thực hiện phép xor giữa từng ký tự trong file `enc.txt` với từng giá trị `key` để tìm flag.
- Tôi sẽ dùng Python để thực hiện.
```
key = [35, 43, 46, 133, 76, 190, 133, 141, 82, 152, 113, 152, 251, 119, 137, 119, 47, 180, 142, 115, 88, 26, 240, 204, 15, 248, 148, 101, 244, 117, 213, 189, 221, 36, 201, 33, 52, 216, 197, 32, 154, 186, 35, 64, 208, 152, 66, 239, 216, 128, 207, 188, 87, 142, 67, 199, 62, 2, 173, 118, 169, 149, 178, 106, 8, 14, 210, 178, 124, 16, 237, 62, 132, 54]

# Đọc nội dung từ file enc.txt
with open('enc.txt', 'rb') as file:
    data = file.read()  # Đọc toàn bộ dữ liệu dưới dạng nhị phân (bytes)

flag = ""

# Duyệt qua từng byte của file 'data' và XOR với phần tử tương ứng trong 'key'
for i in range(len(data)):
    result = chr(key[i] ^ data[i])  # Sử dụng phép XOR trên byte
    flag += result

print(flag)
```
### Flag
`KCSC{0xffffff_is_1970-07-14,I_created_this_challenge_at_"the_end"_of_time}`