# 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}`