# (Write-up) Reversing.Kr: Easy Keygen # ****🤔O****verview Khi giải nén file thử thách thì nhận được hai file là ****Easy Keygen.exe**** và **ReadMe.txt.** ![](https://hackmd.io/_uploads/S1dipaYJa.png) Chạy file **exe**, nhập tên và serial sau đó enter thì không có gì xảy ra. Miêu tả của chall này được đề cập trong file **ReadMe.txt** # 💻Problem ![](https://hackmd.io/_uploads/H1k2a6FJa.png) Trong chall này, vấn đề cần giải quyết là phải tìm **Name (**cũng chính là key**)** phù hợp với **Serial** được cho ****là **5B134977135E7D13.** # 🚩Let’s go Mở file **exe** trong **IDA** và tìm nơi có nhiệm vụ chuyển đổi **Name** nhập vào thành **Serial.** Chuyển sang mã giả để dễ dàng phân tích hơn thì mình tìm thấy đoạn này xử lý việc chuyển đổi thành **Serial:** ![](https://hackmd.io/_uploads/HJU3pTKkT.png) Vậy là **Serial** được sinh ra từ đoạn code: ```c for ( i = 0; v3 < (int)strlen(v8); ++i ) { if ( i >= 3 ) i = 0; sprintf(Buffer, "%s%02X", Buffer, v8[v3++] ^ v7[i - 1]); } ``` (**v8** chính là **Name** được người dùng nhập vào) Xem giá trị của **v7** ở assembly: ![](https://hackmd.io/_uploads/Bk326TK16.png) Vậy giá trị của **v7** là **[0x10, 0x20, 0x30]** Dựa trên những dữ kiện trên, mình code lại đoạn mã **Python** để đảo ngược từ mã **Serial** trở lại thành **Name:** ```python v8 = "5B134977135E7D13" v8 = bytes.fromhex(v8) v7 = [0x10, 0x20, 0x30] key = "" for i in range(8): key += chr(v8[i] ^ v7[i%3]) print("Key: " + key) ``` Và kết quả nhận được khi chạy chương trình trên là: ![](https://hackmd.io/_uploads/SkmppTtJ6.png) Vậy key của chall này là: **`K3yg3nm3`**