# RE Time travel (KCSC)
## Challenges

### 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.

- Đâ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
- 
- 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}`