> For the complete documentation index, see [llms.txt](https://twentysick.gitbook.io/twentysick/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://twentysick.gitbook.io/twentysick/writeup/flare-on/flare-on-2025/7-the-boss-needs-help.md).

# 7 - The Boss Needs Help

### Description

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FfjXBFaITGu4LrREK4vf2%2F7.png?alt=media&amp;token=5a2cb79a-36f7-4d4a-b5a3-f428158ad4b5" alt=""><figcaption></figcaption></figure>

### Solution

Sau khi extract, mình có nhận được 2 file là `hopeanddreams.exe` và `packets.pcapng`

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FWuo5IjoP265Epclc2NXG%2Fimage.png?alt=media&amp;token=2e63057f-f583-4fd5-8df7-3cbce7c3b8ad" alt=""><figcaption></figcaption></figure>

Nhìn vào 2 file này thì mình có linh cảm rằng file `hopeanddreams.exe` sẽ có connect ra ngoài và bị ghi lại hết request vào file `packets.pcapng` và flag sẽ xuất hiện trong file `packets.pcapng`

Mình mở file packets.pcapng để xem và thấy được mấy cái sau:

* Có 2 domain được gửi request tới lần lượt là:
  * *twelve.flare-on.com (port 8000)*
  * *theannualtraditionofstaringatdisassemblyforweeks.torealizetheflagwasjustxoredwiththefilenamethewholetime.com (port 8080)*
* Dữ liệu khi gửi đi và nhận về có định dạng *json*, nhưng dữ liệu lại trông như thế này với từng domain  (ví dụ 1 stream hoi nhé)

  * *twelve.flare-on.com*

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FBMecKyn4zSVGgJTVhccH%2Fimage.png?alt=media&amp;token=8b33bd38-bb88-4439-a72e-cbaca60395dd" alt=""><figcaption></figcaption></figure>

  * *theannualtraditionofstaringatdisassemblyforweeks.torealizetheflagwasjustxoredwiththefilenamethewholetime.com*

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FDYvZjmSX35Kg3bLAkEgs%2Fimage.png?alt=media&amp;token=42c80fd0-e9d4-483c-975c-cdb5ac832553" alt=""><figcaption></figcaption></figure>

Vậy mình hình dung được mục tiêu của mình là xem mấy cái giá trị "*d*" kia thực chất là gì.

Tiếp theo đó, chính là file `hopeanddreams.exe`, mình đã load file vào *CFF Explorer*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FOySEkzGxmR2h6qc7EveJ%2Fimage.png?alt=media&amp;token=bfcf2c54-e6b6-44e9-9af0-2575383407ff" alt=""><figcaption></figcaption></figure>

Mình load file `hopeanddreams.exe` vào IDA để xem file này nó thế nào.&#x20;

THÌ BỖNG THẤY HIỆN TƯỢNG LẠ

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FccNfl6VDOXrtFBVXBmFM%2Fimage.png?alt=media&amp;token=ecb780fd-c09b-48be-9462-53143cfc7442" alt=""><figcaption></figcaption></figure>

Hmmmm, nhìn kỹ hơn xem nào

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FJZgRPOqT0rUiDgpTMyxj%2Fimage.png?alt=media&amp;token=7dbed4cc-567d-4ba3-8ae1-96efe1374708" alt=""><figcaption></figcaption></figure>

Và rồi điều gì tới cũng tới, hàm *main* kiểu

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FrfLjlgPoVYLvjwI5Jk9q%2Fimage.png?alt=media&amp;token=a42a30c6-c5a8-48e1-8167-99b5477f3a7f" alt=""><figcaption></figcaption></figure>

**Tuyệt vời !!!**

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FrsO5zFFFM5p9vco6whiH%2Fimage.png?alt=media&amp;token=23345d47-240d-440f-a293-3d4f5a7b5955" alt=""><figcaption></figcaption></figure>

**Tuyệt vời !!! Tuyệt vời !!! Tuyệt vời !!!**

Sau một hồi ngồi lăn chuột, set breakpoint, và run, mình thấy khúc đầu sẽ thực hiện

* Lấy thông tin máy đang thực thi file
* Decrypt đường dẫn *twelve.flare-on.com:8000/good*
* Lấy giá trị "*d*" của response trên:

  * Tìm vị trí của từng  *byte* trong mảng sau rồi lưu lại vào 1 mảng mới

  ```
  0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 
  0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 
  0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 
  0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 
  0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 
  0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 
  0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 
  0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 
  0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 
  0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 
  0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 
  0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 
  0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 
  0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 
  0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 
  0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
  ```

  * Lấy từng giá trị trong mảng mới tạo trừ đi vị trí của nó trong mảng +1 và chuyển về dạng *unsigned byte*. Để cho dễ hình dung thì nó sẽ trông như thế này

  <pre class="language-python" data-full-width="false"><code class="lang-python">from Crypto.Util.number import long_to_bytes

  lst = [ 
  	0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 
  	0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 
  	0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 
  	0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 
  	0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 
  	0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 
  	0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 
  	0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 
  	0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 
  	0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 
  	0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 
  	0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 
  	0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 
  	0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 
  	0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 
  	0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
  ] 

  d = list(long_to_bytes(0x085d8ea282da6cf76bb2765bc3b26549a1f6bdf08d8da2a62e05ad96ea645c685da48d66ed505e2e28b968d15dabed15ab1500901eb9da4606468650f72550483f1e8c58ca13136bb8028f976bedd36757f705ea5f74ace7bd8af941746b961c45bcac1eaf589773cecf6f1c620e0e37ac1dfc9611aa8ae6e6714bb79a186f47896f18203eddce97f496b71a630779b136d7bf0c82d560))

  for i in range(len(d)):
  	print(hex( (lst.index(d[i]) - (i + 1)) &#x26; 0xff )[2:], end = " ")
  </code></pre>

  * Cuối cùng, lấy từng giá trị vừa rồi XOR với *\<Username>@\<Machine name>*

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FgkEpKJlQgledT5z7SYLt%2Fimage.png?alt=media&amp;token=7028b8be-8fb9-4af7-825b-b83cbeec84ad" alt=""><figcaption></figcaption></figure>

Tiếp theo, mình đã chạy lệnh `python -m http.server 8000` để giả lập lại việc file thực thi kết nối tại stream đầu tiên, và đương nhiên là có sửa file *C:\Windows\System32\drivers\etc\hosts* để khi request được gửi đi với tên miền thì sẽ trỏ thẳng về ip máy mình muốn

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FOOYJqs33hxfEJUzt51yA%2Fimage.png?alt=media&amp;token=fd512aca-9fee-420f-aa85-2cbb49fa67ff" alt=""><figcaption></figcaption></figure>

Bên cạnh đó, mình có tạo 1 file *good* để khi file thực thi gửi tới, sẽ trả về kết quả mà mình muốn. Nội dung file kiểu

```
{"d": "085d8ea282da6cf76bb2765bc3b26549a1f6bdf08d8da2a62e05ad96ea645c685da48d66ed505e2e28b968d15dabed15ab1500901eb9da4606468650f72550483f1e8c58ca13136bb8028f976bedd36757f705ea5f74ace7bd8af941746b961c45bcac1eaf589773cecf6f1c620e0e37ac1dfc9611aa8ae6e6714bb79a186f47896f18203eddce97f496b71a630779b136d7bf0c82d560"}
```

Vậy là setup xong, mình tiến hành debug tiếp để xem file sẽ làm gì với đường dẫn *theannualtraditionofstaringatdisassemblyforweeks.torealizetheflagwasjustxoredwiththefilenamethewholetime.com.* Thì ôi thật bất ngờ, nó sẽ tạo body là thông tin máy mà lấy được trước đó, xong truyền vào 1 hàm thực hiện mã hóa rồi gửi đi.

Mình đã tìm được hàm mã hóa, chính là *sub\_140050D20* (Tại thời điểm mình làm, mình không nhận ra đây là AES-CBC-256 Sbox gì đó  😭 )

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FE0QbSxggjw87SKQTinxE%2Fimage.png?alt=media&amp;token=c5134dc8-5a0c-4e3e-853b-75484159462f" alt=""><figcaption></figcaption></figure>

Tuyệt vời hơn là ở cái hàm *sub\_140050560* sẽ thực hiện việc encrypt chính

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fvjk97Hze1RRQ0FmzdMKS%2Fimage.png?alt=media&amp;token=548682ff-d05b-46aa-9bc5-aedf3fbd06dd" alt=""><figcaption></figcaption></figure>

Mình đã tiến hành đào sâu hơn vào cái hàm *sub\_140050D20* và *sub\_140050560* . Thì mình thấy có những cái sau:

* Mỗi lần thực hiện, sẽ thực hiện mã hóa 16 bytes trong 1 lần (kiểu block nó thế)
* Tại hàm *sub\_140050D20*&#x20;

  * Tạo một mảng, sau đó sử dụng để mã hóa lần đầu

  ```
  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
  ```

  * Các lần tiếp sẽ sử dụng kết quả của lần mã hóa trước để thực hiện mã hóa
* Tại hàm *sub\_140050560*

  * Sẽ có sử dụng đến mảng sau (Mình gọi là mảng A nhé cho dễ nhắc lại):

  ```
  0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
  0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
  0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
  0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
  0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
  0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
  0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
  0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
  0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
  0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
  0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
  0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
  0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
  0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
  0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
  0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16
  ```

  * Sử dụng thêm 1 mảng với độ dài 15 x 16 bytes (Mình sẽ gọi cái này là ***key***), cái mảng này sẽ được tạo khi thực thi file. Và chia làm 3 phần, trông như sau:

  ```
  a00 a01 a02 a03 a04 a05 a06 a07 a08 a09 a0A a0B a0C a0D a0E a0F

  b00 b01 b02 b03 b04 b05 b06 b07 b08 b09 b0A b0B b0C b0D b0E b0F
  b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b1A b1B b1C b1D b1E b1F
  b20 b21 b22 b23 b24 b25 b26 b27 b28 b29 b2A b2B b2C b2D b2E b2F
  b30 b31 b32 b33 b34 b35 b36 b37 b38 b39 b3A b3B b3C b3D b3E b3F
  b40 b41 b42 b43 b44 b45 b46 b47 b48 b49 b4A b4B b4C b4D b4E b4F
  b50 b51 b52 b53 b54 b55 b56 b57 b58 b59 b5A b5B b5C b5D b5E b5F
  b60 b61 b62 b63 b64 b65 b66 b67 b68 b69 b6A b6B b6C b6D b6E b6F
  b70 b71 b72 b73 b74 b75 b76 b77 b78 b79 b7A b7B b7C b7D b7E b7F
  b80 b81 b82 b83 b84 b85 b86 b87 b88 b89 b8A b8B b8C b8D b8E b8F
  b90 b91 b92 b93 b94 b95 b96 b97 b98 b99 b9A b9B b9C b9D b9E b9F
  bA0 bA1 bA2 bA3 bA4 bA5 bA6 bA7 bA8 bA9 bAA bAB bAC bAD bAE bAF
  bB0 bB1 bB2 bB3 bB4 bB5 bB6 bB7 bB8 bB9 bBA bBB bBC bBD bBE bBF
  bC0 bC1 bC2 bC3 bC4 bC5 bC6 bC7 bC8 bC9 bCA bCB bCC bCD bCE bCF

  c00 c01 c02 c03 c04 c05 c06 c07 c08 c09 c0A c0B c0C c0D c0E c0F
  ```

  * Mình chia làm 3 phần:

    * Phần 1: Thực hiện XOR với 16 byte đầu trong mảng mình vừa nêu trên, cụ thể là:

    ```
    a00 a01 a02 a03 a04 a05 a06 a07 a08 a09 a0A a0B a0C a0D a0E a0F
    ```

    * Phần 2: Lặp 13 lần

      * Thực hiện với mảng A, kiểu (pseudocode):

      ```python
      for i in range(16):
          inp[i] = A[inp[i]]
      ```

      * Tiếp theo, thực hiện thay đổi các vị trí theo thứ tự cố định, trông như sau (Mình tạm gọi là shuffle nhé):

      ```
      Before : a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aA aB aC aD aE aF
      After  : a0 a5 aA aF a4 a9 aE a3 a8 aD a2 a7 aC a1 a6 aB
      ```

      * Sau đó, thực hiện XOR 4 bytes 1, mình đã viết 1 đoạn script để xem và thật bất ngờ, là sau 12 lần thực hiện, sẽ quay lại trạng thái ban đầu

      ```python
      def encrypt(b):
      	c = [0] * 16
      	for i in range(0, 16, 4):
      		MM = b[i + 0] ^ b[i + 1] ^ b[i + 2] ^ b[i + 3]
      		c[i + 0] = MM ^ b[i + 0] ^ (((((b[i + 0] ^ b[i + 1]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 0] ^ b[i + 1]) * 2) & 0xff)
      		c[i + 1] = MM ^ b[i + 1] ^ (((((b[i + 1] ^ b[i + 2]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 1] ^ b[i + 2]) * 2) & 0xff)
      		c[i + 2] = MM ^ b[i + 2] ^ (((((b[i + 2] ^ b[i + 3]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 2] ^ b[i + 3]) * 2) & 0xff)
      		c[i + 3] = MM ^ b[i + 3] ^ (((((b[i + 3] ^ b[i + 0]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 3] ^ b[i + 0]) * 2) & 0xff)
      	return c

      b = [0x08,0x56,0x6C,0x98,0x3A,0x3A,0x32,0xEE,0xC7,0x32,0xFB,0x22,0x12,0x44,0xC3,0x20]

      for i in range(13):

      	print(f"Round {i:02}: " + "".join(f"{j:02x} " for j in b))
      	
      	b = encrypt(b)

      ## Output
      # Round 00: 08 56 6c 98 3a 3a 32 ee c7 32 fb 22 12 44 c3 20 
      # Round 01: 1e 88 35 09 e6 f6 4d 81 1a 97 7e df 0b e4 ab f1 
      # Round 02: 83 43 e7 8d 1a 47 12 93 37 72 0b 62 7b cf aa ab 
      # Round 03: b2 ba 99 3b 7c 31 d7 46 91 ac f5 e4 bd b0 1d a5 
      # Round 04: 08 56 6c 98 3a 3a 32 ee c7 32 fb 22 12 44 c3 20 
      # Round 05: 1e 88 35 09 e6 f6 4d 81 1a 97 7e df 0b e4 ab f1 
      # Round 06: 83 43 e7 8d 1a 47 12 93 37 72 0b 62 7b cf aa ab 
      # Round 07: b2 ba 99 3b 7c 31 d7 46 91 ac f5 e4 bd b0 1d a5 
      # Round 08: 08 56 6c 98 3a 3a 32 ee c7 32 fb 22 12 44 c3 20 
      # Round 09: 1e 88 35 09 e6 f6 4d 81 1a 97 7e df 0b e4 ab f1 
      # Round 10: 83 43 e7 8d 1a 47 12 93 37 72 0b 62 7b cf aa ab 
      # Round 11: b2 ba 99 3b 7c 31 d7 46 91 ac f5 e4 bd b0 1d a5 
      # Round 12: 08 56 6c 98 3a 3a 32 ee c7 32 fb 22 12 44 c3 20 
      ```

      * Cuối cùng sẽ thực hiện XOR với 16 bytes. 16 bytes này chính là 16 bytes trong 13 x 16 bytes ở giữa mà mình có nêu bên trên. Mình có ghi lại 16 byte nào được sử dụng cho lần lặp nào ở bên dưới:

      ```
      +--------+-----------------------------------------------------------------+
      | Lần 01 | b00 b01 b02 b03 b04 b05 b06 b07 b08 b09 b0A b0B b0C b0D b0E b0F |
      +--------+-----------------------------------------------------------------+
      | Lần 02 | b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b1A b1B b1C b1D b1E b1F |
      +--------+-----------------------------------------------------------------+
      | Lần 03 | b20 b21 b22 b23 b24 b25 b26 b27 b28 b29 b2A b2B b2C b2D b2E b2F |
      +--------+-----------------------------------------------------------------+
      | Lần 04 | b30 b31 b32 b33 b34 b35 b36 b37 b38 b39 b3A b3B b3C b3D b3E b3F |
      +--------+-----------------------------------------------------------------+
      | Lần 05 | b40 b41 b42 b43 b44 b45 b46 b47 b48 b49 b4A b4B b4C b4D b4E b4F |
      +--------+-----------------------------------------------------------------+
      | Lần 06 | b50 b51 b52 b53 b54 b55 b56 b57 b58 b59 b5A b5B b5C b5D b5E b5F |
      +--------+-----------------------------------------------------------------+
      | Lần 07 | b60 b61 b62 b63 b64 b65 b66 b67 b68 b69 b6A b6B b6C b6D b6E b6F |
      +--------+-----------------------------------------------------------------+
      | Lần 08 | b70 b71 b72 b73 b74 b75 b76 b77 b78 b79 b7A b7B b7C b7D b7E b7F |
      +--------+-----------------------------------------------------------------+
      | Lần 09 | b80 b81 b82 b83 b84 b85 b86 b87 b88 b89 b8A b8B b8C b8D b8E b8F |
      +--------+-----------------------------------------------------------------+
      | Lần 10 | b90 b91 b92 b93 b94 b95 b96 b97 b98 b99 b9A b9B b9C b9D b9E b9F |
      +--------+-----------------------------------------------------------------+
      | Lần 11 | bA0 bA1 bA2 bA3 bA4 bA5 bA6 bA7 bA8 bA9 bAA bAB bAC bAD bAE bAF |
      +--------+-----------------------------------------------------------------+
      | Lần 12 | bB0 bB1 bB2 bB3 bB4 bB5 bB6 bB7 bB8 bB9 bBA bBB bBC bBD bBE bBF |
      +--------+-----------------------------------------------------------------+
      | Lần 13 | bC0 bC1 bC2 bC3 bC4 bC5 bC6 bC7 bC8 bC9 bCA bCB bCC bCD bCE bCF |
      +--------+-----------------------------------------------------------------+
      ```
    * Phần 3: Sau khi thực hiện lặp 13 lần xong, sẽ thực hiện giống với 1 lần lặp của cái bên trên nhưng mà với 16 bytes cuối:

    ```
    c00 c01 c02 c03 c04 c05 c06 c07 c08 c09 c0A c0B c0C c0D c0E c0F
    ```

Sau phân tích trên cùng với debug, mình đã đi tìm cụ thể 15 x 16 bytes dùng làm **key** bằng cách chạy debug thì có tìm được khi đặt breakpoint ngay tại hàm đó. Tuy nhiên, trong quá trình debug, mình có thấy việc gọi thời gian của máy và việc không để ý tới cái đó đã làm mình tốn kha khá thời gian.&#x20;

***Key** sẽ được tạo dựa vào thời gian.* File sẽ thực hiện việc lấy giá trị ***Hour*** của máy cùng với ***Username*** và ***Machine Name*** của máy đang thực thi để tạo key, cụ thể (Đây là key được tạo với *Username* là *TheBoss* và *Machine Name* là *THUNDERNODE*):

```
...
Tại 05 giờ (UTC)
DD C6 79 C5 8F 81 1C 9A B8 AF 01 A6 A6 C4 3B 36
3A 56 29 AD ED 91 B0 BD BA BB B2 30 7E 0E CF 1F
77 4C B9 36 F8 CD A5 AC 40 62 A4 0A E6 A6 9F 3C
B4 72 F2 46 59 E3 42 FB E3 58 F0 CB 9D 56 3F D4
C4 39 F1 68 3C F4 54 C4 7C 96 F0 CE 9A 30 6F F2
0C 76 5A CF 55 95 18 34 B6 CD E8 FF 2B 9B D7 2B
D4 37 00 99 E8 C3 54 5D 94 55 A4 93 0E 65 CB 61
A7 3B 45 20 F2 AE 5D 14 44 63 B5 EB 6F F8 62 C0
9D 9D BA 31 75 5E EE 6C E1 0B 4A FF EF 6E 81 9E
78 A4 49 2B 8A 0A 14 3F CE 69 A1 D4 A1 91 C3 14
0C B3 40 03 79 ED AE 6F 98 E6 E4 90 77 88 65 0E
8D 60 04 80 07 6A 10 BF C9 03 B1 6B 68 92 72 7F
63 F3 92 46 1A 1E 3C 29 82 F8 D8 B9 F5 70 BD B7
6B 31 7E 29 6C 5B 6E 96 A5 58 DF FD CD CA AD 82
57 66 81 FB 4D 78 BD D2 CF 80 65 6B 3A F0 D8 DC

Tại 06 giờ (UTC)
95 AF 8B 09 5B 74 65 F9 05 9D 03 58 BA CC 22 38
50 40 59 A0 BD 79 B4 9B 67 90 A6 62 0A DD 6D 96
55 93 1B 6E 0E E7 7E 97 0B 7A 7D CF B1 B6 5F F7
98 0E 96 C8 25 77 22 53 42 E7 84 31 48 3A E9 A7
D7 8D 47 3C D9 6A 39 AB D2 10 44 64 63 A6 1B 93
63 2A 39 14 46 5D 1B 47 04 BA 9F 76 4C 80 76 D1
1E B5 79 15 C7 DF 40 BE 15 CF 04 DA 76 69 1F 49
5B D3 F9 2F 1D 8E E2 68 19 34 7D 1E 55 B4 0B CF
9B 9E F3 E9 5C 41 B3 57 49 8E B7 8D 3F E7 A8 C4
2E 47 3B 33 33 C9 D9 5B 2A FD A4 45 7F 49 AF 8A
B0 E7 8D 3B EC A6 3E 6C A5 28 89 E1 9A CF 21 25
96 CD C6 0C A5 04 1F 57 8F F9 BB 12 F0 B0 14 98
77 1D CB B7 9B BB F5 DB 3E 93 7C 3A A4 5C 5D 1F
DF 87 8A CC 7A 83 95 9B F5 7A 2E 89 05 CA 3A 11
43 9D 49 DC D8 26 BC 07 E6 B5 C0 3D 42 E9 9D 22

Tại 07 giờ (UTC)
D7 33 14 01 50 43 16 B8 99 78 50 47 FC D3 F4 77
EA B5 E6 72 D5 A9 91 E6 90 BC 61 E6 74 E8 8F 06
4D 40 7B 93 1D 03 6D 2B 84 7B 3D 6C 78 A8 C9 1B
56 77 3B DD 83 DE AA 3B 13 62 CB DD 67 8A 44 DB
31 5B C2 16 2C 58 AF 3D A8 23 92 51 D0 8B 5B 4A
26 4A 02 0B A5 94 A8 30 B6 F6 63 ED D1 7C 27 36
25 97 C7 28 09 CF 68 15 A1 EC FA 44 71 67 A1 0E
85 CF 30 A0 20 5B 98 90 96 AD FB 7D 47 D1 DC 4B
13 11 74 88 1A DE 1C 9D BB 32 E6 D9 CA 55 47 D7
F1 33 90 AE D1 68 08 3E 47 C5 F3 43 00 14 2F 08
F9 04 44 EB E3 DA 58 76 58 E8 BE AF 92 BD F9 78
BE 49 09 12 6F 21 01 2C 28 E4 F2 6F 28 F0 DD 67
55 C5 C1 DF B6 1F 99 A9 EE F7 27 06 7C 4A DE 7E
AE 9F 14 E1 C1 BE 15 CD E9 5A E7 A2 C1 AA 3A C5
B9 45 67 A7 0F 5A FE 0E E1 AD D9 08 9D E7 07 76
...
```

Thấy vậy, nên mình đã quay lại check file `packets.pcapng` bắt là vào khoảng thời gian nào. Zà nó chính là khoảng 6 giờ (UTC) - Nhìn vào giá trị *Date* trong response là thấy

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fs6yPyvgbKlshkeEDcFVA%2Fimage.png?alt=media&amp;token=bfbc9247-7306-421a-ba3f-4b7df713a5e3" alt=""><figcaption></figcaption></figure>

Nên mình đã lấy được **Key** cho phần mã hóa là:

```
95 AF 8B 09 5B 74 65 F9 05 9D 03 58 BA CC 22 38
50 40 59 A0 BD 79 B4 9B 67 90 A6 62 0A DD 6D 96
55 93 1B 6E 0E E7 7E 97 0B 7A 7D CF B1 B6 5F F7
98 0E 96 C8 25 77 22 53 42 E7 84 31 48 3A E9 A7
D7 8D 47 3C D9 6A 39 AB D2 10 44 64 63 A6 1B 93
63 2A 39 14 46 5D 1B 47 04 BA 9F 76 4C 80 76 D1
1E B5 79 15 C7 DF 40 BE 15 CF 04 DA 76 69 1F 49
5B D3 F9 2F 1D 8E E2 68 19 34 7D 1E 55 B4 0B CF
9B 9E F3 E9 5C 41 B3 57 49 8E B7 8D 3F E7 A8 C4
2E 47 3B 33 33 C9 D9 5B 2A FD A4 45 7F 49 AF 8A
B0 E7 8D 3B EC A6 3E 6C A5 28 89 E1 9A CF 21 25
96 CD C6 0C A5 04 1F 57 8F F9 BB 12 F0 B0 14 98
77 1D CB B7 9B BB F5 DB 3E 93 7C 3A A4 5C 5D 1F
DF 87 8A CC 7A 83 95 9B F5 7A 2E 89 05 CA 3A 11
43 9D 49 DC D8 26 BC 07 E6 B5 C0 3D 42 E9 9D 22
```

Sau đó mình đã viết script để decrypt giá trị "*d*" trong stream đầu tiên (Xinloi vì trình code cùi 😭)

```python
def encrypt(b):
	c = [0] * 16
	for i in range(0, 16, 4):
		MM = b[i + 0] ^ b[i + 1] ^ b[i + 2] ^ b[i + 3]
		c[i + 0] = MM ^ b[i + 0] ^ (((((b[i + 0] ^ b[i + 1]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 0] ^ b[i + 1]) * 2) & 0xff)
		c[i + 1] = MM ^ b[i + 1] ^ (((((b[i + 1] ^ b[i + 2]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 1] ^ b[i + 2]) * 2) & 0xff)
		c[i + 2] = MM ^ b[i + 2] ^ (((((b[i + 2] ^ b[i + 3]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 2] ^ b[i + 3]) * 2) & 0xff)
		c[i + 3] = MM ^ b[i + 3] ^ (((((b[i + 3] ^ b[i + 0]) & 0xff) >> 7) * 0x1b) & 0xff) ^ (((b[i + 3] ^ b[i + 0]) * 2) & 0xff)
	return c

def shuffle_16_elements(a):
	
	# Before: 0 1 2 3 4 5 6 7 8 9 A B C D E F
	# After : 0 5 A F 4 9 E 3 8 D 2 7 C 1 6 B
	
	res = [0] * 16
	
	res[0x0] = a[0x0]
	res[0x1] = a[0xd]
	res[0x2] = a[0xa]
	res[0x3] = a[0x7]
	res[0x4] = a[0x4]
	res[0x5] = a[0x1]
	res[0x6] = a[0xe]
	res[0x7] = a[0xb]
	res[0x8] = a[0x8]
	res[0x9] = a[0x5]
	res[0xa] = a[0x2]
	res[0xb] = a[0xf]
	res[0xc] = a[0xc]
	res[0xd] = a[0x9]
	res[0xe] = a[0x6]
	res[0xf] = a[0x3]

	return res

def decrypting(c, key):
	
	A = [
		0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
		0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
		0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
		0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
		0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
		0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
		0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
		0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
		0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
		0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
		0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
		0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
		0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
		0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
		0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
		0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16
	]

	# Chia key thành 3 phần
	k1 = key[0]
	k2 = key[13:0:-1]
	k3 = key[14]

	res = [0] * 16
	
	# Phần 3
	for i in range(16):
		res[i] = c[i] ^ k3[i]

	res = shuffle_16_elements(res)
	for i in range(16):
		res[i] = A.index(res[i])

	# Phần 2
	for i in range(13):

		for ii in range(16):
			res[ii] = res[ii] ^ k2[i][ii]
		
		for ii in range(11):
			res = encrypt(res)

		res = shuffle_16_elements(res)
		for ii in range(16):
			res[ii] = A.index(res[ii])


	# Phần 1
	for i in range(16):
		res[i] = res[i] ^ k1[i]

	return res

def main():
	c = [
		[0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f]
	]

	key = [
		[0x95,0xAF,0x8B,0x09,0x5B,0x74,0x65,0xF9,0x05,0x9D,0x03,0x58,0xBA,0xCC,0x22,0x38],
		[0x50,0x40,0x59,0xA0,0xBD,0x79,0xB4,0x9B,0x67,0x90,0xA6,0x62,0x0A,0xDD,0x6D,0x96],
		[0x55,0x93,0x1B,0x6E,0x0E,0xE7,0x7E,0x97,0x0B,0x7A,0x7D,0xCF,0xB1,0xB6,0x5F,0xF7],
		[0x98,0x0E,0x96,0xC8,0x25,0x77,0x22,0x53,0x42,0xE7,0x84,0x31,0x48,0x3A,0xE9,0xA7],
		[0xD7,0x8D,0x47,0x3C,0xD9,0x6A,0x39,0xAB,0xD2,0x10,0x44,0x64,0x63,0xA6,0x1B,0x93],
		[0x63,0x2A,0x39,0x14,0x46,0x5D,0x1B,0x47,0x04,0xBA,0x9F,0x76,0x4C,0x80,0x76,0xD1],
		[0x1E,0xB5,0x79,0x15,0xC7,0xDF,0x40,0xBE,0x15,0xCF,0x04,0xDA,0x76,0x69,0x1F,0x49],
		[0x5B,0xD3,0xF9,0x2F,0x1D,0x8E,0xE2,0x68,0x19,0x34,0x7D,0x1E,0x55,0xB4,0x0B,0xCF],
		[0x9B,0x9E,0xF3,0xE9,0x5C,0x41,0xB3,0x57,0x49,0x8E,0xB7,0x8D,0x3F,0xE7,0xA8,0xC4],
		[0x2E,0x47,0x3B,0x33,0x33,0xC9,0xD9,0x5B,0x2A,0xFD,0xA4,0x45,0x7F,0x49,0xAF,0x8A],
		[0xB0,0xE7,0x8D,0x3B,0xEC,0xA6,0x3E,0x6C,0xA5,0x28,0x89,0xE1,0x9A,0xCF,0x21,0x25],
		[0x96,0xCD,0xC6,0x0C,0xA5,0x04,0x1F,0x57,0x8F,0xF9,0xBB,0x12,0xF0,0xB0,0x14,0x98],
		[0x77,0x1D,0xCB,0xB7,0x9B,0xBB,0xF5,0xDB,0x3E,0x93,0x7C,0x3A,0xA4,0x5C,0x5D,0x1F],
		[0xDF,0x87,0x8A,0xCC,0x7A,0x83,0x95,0x9B,0xF5,0x7A,0x2E,0x89,0x05,0xCA,0x3A,0x11],
		[0x43,0x9D,0x49,0xDC,0xD8,0x26,0xBC,0x07,0xE6,0xB5,0xC0,0x3D,0x42,0xE9,0x9D,0x22]
	]

	d = "3b001a3d06733da13984c89fe99ffc936128497575d01feab284eba5da0bd909d11be82b443705dc61cd307635ff27998d65e911837716ed7c190504472831cc78c19f578ff339cfa7e046695a98fcb4bfaf4a586294a86c72113d06733e3542c14dc0451af3fc79b1f1a2e9b26e4723a21a5b632b1d434e51ab070cb53373fcff024ba26f9cfd673284fc47bd768e2262a394559ff0194b9b4103951f14bcb8"
	for i in range(0,len(d), 32):
		temp1 = d[i:i+32]
		lst_t = list()
		for ii in range(0, len(temp1), 2):
			lst_t.append(int(temp1[ii] + temp1[ii+1], 16))
		c.append(lst_t)

	plaintext = ""
	for i in range(len(c)-1, 0, -1):
		res = decrypting(c[i], key)
		temp = ""
		for ii in range(16):
			temp += chr(res[ii] ^ c[i-1][ii])

		plaintext = temp + plaintext

	print(plaintext)

if __name__ == '__main__':
	main()
```

Mình ngỡ như Xuân đã về khi đã thấy decrypt thành công giá trị "*d*" của stream đầu tiên với output là:

{% code overflow="wrap" %}

```
{"ci":"Architecture: x64, Cores: 2","cn":"THUNDERNODE","hi":"TheBoss@THUNDERNODE","mI":"6143 MB","ov":"Windows 6.2 (Build 9200)","un":"TheBoss"}
```

{% endcode %}

Và thế là mình tiếp tục thực hiện decrypt giá trị "*d*" các stream còn lại với script trên (Đều thực hiện decrypt được giá trị "*d*" cả request và response nhé). Cho tới ***stream thứ 54*** thì mình không decrypt được nữa. Mình đã decrypt giá trị "d" của ***stream thứ 53*** xem nội dung của nó là gì

* Stream thứ 53

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FmyJkaLYtfRz4U88oMdoI%2Fimage.png?alt=media&amp;token=18b90e21-14a9-4dc9-a09b-15cd4f05e1d5" alt=""><figcaption></figcaption></figure>

* Nội dung khi decrypt

```
{"msg": "cmd", "d": {"cid": 6, "dt": 20, "np": "TheBoss@THUNDERNODE"}}
```

*Có khi nào nó tạo key mới không?*

Mình đã nhờ chatbot viết hộ cái script chạy bằng python xem với response là `{"d": "8c58be3320873de641f94200087e77cfe3904ea49d90924454cb06e2fcc98023480053b247db8a06e4475475d231d5b7e34649a851657664e7ede1a222984735f22987bff7d8a4298a23cba90d297d5d"}` thì file thực thi sẽ làm trò gì (Bên cạnh đó có sửa file *C:\Windows\System32\drivers\etc\hosts* để trỏ về máy mình):

* Nội dung file *C:\Windows\System32\drivers\etc\hosts:*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FqrV1MCsN5uXKFb8l2ror%2Fimage.png?alt=media&amp;token=a635919a-e104-4a4e-91eb-af771b1ed8b1" alt=""><figcaption></figcaption></figure>

* Nội dung file script:

```python
from http.server import BaseHTTPRequestHandler, HTTPServer
import logging

class S(BaseHTTPRequestHandler):
    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
        self._set_response()
        self.wfile.write("{\"d\": \"8c58be3320873de641f94200087e77cfe3904ea49d90924454cb06e2fcc98023480053b247db8a06e4475475d231d5b7e34649a851657664e7ede1a222984735f22987bff7d8a4298a23cba90d297d5d\"}".encode('utf-8'))

    def do_POST(self):
        self._set_response()
        self.wfile.write("{\"d\": \"5134c8a46686f2950972712f2cd84174\"}".encode('utf-8'))

def run(server_class=HTTPServer, handler_class=S, port=8080):
    logging.basicConfig(level=logging.INFO)
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    logging.info('Starting httpd...\n')
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    logging.info('Stopping httpd...\n')

if __name__ == '__main__':
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()
```

Và tuyệt vời, sau cái stream đó, file nó tạo key mới thật.&#x20;

*(Tại sao mình không viết luôn đoạn script để tạo key? - Mình quá lười, nên để file tạo hộ mình thôi)*

**Key** mới lúc này là :

```
84 8A 5E 07 12 03 CC 8E 8F 47 6C 25 A3 D1 82 5F
D5 58 2A E7 AA AD D3 9B BA 70 C9 94 F9 75 7C D9
18 9A 6B 9E 0A 99 A7 10 85 DE CB 35 26 0F 49 6A
22 2E 11 E5 88 83 C2 7E 32 F3 0B EA CB 86 77 33
5E 6F A8 81 54 F6 0F 91 D1 28 C4 A4 F7 27 8D CE
4A E2 4C 6E C2 61 8E 10 F0 92 85 FA 3B 14 F2 C9
A0 E6 75 63 F4 10 7A F2 25 38 BE 56 D2 1F 33 98
FF 22 8F 28 3D 43 01 38 CD D1 84 C2 F6 C5 76 0B
0E DE 5E 21 FA CE 24 D3 DF F6 9A 85 0D E9 A9 1D
28 3C 5C 8C 15 7F 5D B4 D8 AE D9 76 2E 6B AF 7D
61 A7 A1 10 9B 69 85 C3 44 9F 1F 46 49 76 B6 5B
13 04 12 B5 06 7B 4F 01 DE D5 96 77 F0 BE 39 0A
EF B5 C6 9C 74 DC 43 5F 30 43 5C 19 79 35 EA 42
A5 92 95 99 A3 E9 DA 98 7D 3C 4C EF 8D 82 75 E5
BC 28 1F C1 C8 F4 5C 9E F8 B7 00 87 81 82 EA C5
```

Có key mới, mình tiếp tục thực hiện decrypt với cái script thôi. Thì sau tất cả, mình có thấy được:

* Có tất cả 3 key được dùng để mã hóa và giải mã

```
Key 1 (dùng để mã hóa và giải mã từ stream 1 -> stream 53)
95 AF 8B 09 5B 74 65 F9 05 9D 03 58 BA CC 22 38
50 40 59 A0 BD 79 B4 9B 67 90 A6 62 0A DD 6D 96
55 93 1B 6E 0E E7 7E 97 0B 7A 7D CF B1 B6 5F F7
98 0E 96 C8 25 77 22 53 42 E7 84 31 48 3A E9 A7
D7 8D 47 3C D9 6A 39 AB D2 10 44 64 63 A6 1B 93
63 2A 39 14 46 5D 1B 47 04 BA 9F 76 4C 80 76 D1
1E B5 79 15 C7 DF 40 BE 15 CF 04 DA 76 69 1F 49
5B D3 F9 2F 1D 8E E2 68 19 34 7D 1E 55 B4 0B CF
9B 9E F3 E9 5C 41 B3 57 49 8E B7 8D 3F E7 A8 C4
2E 47 3B 33 33 C9 D9 5B 2A FD A4 45 7F 49 AF 8A
B0 E7 8D 3B EC A6 3E 6C A5 28 89 E1 9A CF 21 25
96 CD C6 0C A5 04 1F 57 8F F9 BB 12 F0 B0 14 98
77 1D CB B7 9B BB F5 DB 3E 93 7C 3A A4 5C 5D 1F
DF 87 8A CC 7A 83 95 9B F5 7A 2E 89 05 CA 3A 11
43 9D 49 DC D8 26 BC 07 E6 B5 C0 3D 42 E9 9D 22

Key 2 (dùng để mã hóa và giải mã từ stream 54 -> stream 68)
84 8A 5E 07 12 03 CC 8E 8F 47 6C 25 A3 D1 82 5F
D5 58 2A E7 AA AD D3 9B BA 70 C9 94 F9 75 7C D9
18 9A 6B 9E 0A 99 A7 10 85 DE CB 35 26 0F 49 6A
22 2E 11 E5 88 83 C2 7E 32 F3 0B EA CB 86 77 33
5E 6F A8 81 54 F6 0F 91 D1 28 C4 A4 F7 27 8D CE
4A E2 4C 6E C2 61 8E 10 F0 92 85 FA 3B 14 F2 C9
A0 E6 75 63 F4 10 7A F2 25 38 BE 56 D2 1F 33 98
FF 22 8F 28 3D 43 01 38 CD D1 84 C2 F6 C5 76 0B
0E DE 5E 21 FA CE 24 D3 DF F6 9A 85 0D E9 A9 1D
28 3C 5C 8C 15 7F 5D B4 D8 AE D9 76 2E 6B AF 7D
61 A7 A1 10 9B 69 85 C3 44 9F 1F 46 49 76 B6 5B
13 04 12 B5 06 7B 4F 01 DE D5 96 77 F0 BE 39 0A
EF B5 C6 9C 74 DC 43 5F 30 43 5C 19 79 35 EA 42
A5 92 95 99 A3 E9 DA 98 7D 3C 4C EF 8D 82 75 E5
BC 28 1F C1 C8 F4 5C 9E F8 B7 00 87 81 82 EA C5

Key 3 (dùng để mã hóa và giải mã từ stream 69 -> hết)
CF 92 3B E8 DA 52 63 11 13 75 2D 5B 32 CE F8 0B
9D 2B DA DA C8 51 30 81 1B EE 86 86 8F E9 72 04
D0 D2 C9 9B 0A 80 AA 8A 19 F5 87 D1 2B 3B 7F DA
6C C9 08 8D A4 98 38 0C BF 76 BE 8A 30 9F CC 8E
09 99 D0 9F 03 19 7A 15 1A EC FD C4 31 D7 82 1E
AB C7 1B FF 0F 5F 23 F3 B0 29 9D 79 80 B6 51 F7
43 48 B8 52 40 51 C2 47 5A BD 3F 83 6B 6A BD 9D
D4 C5 61 A1 DB 9A 42 52 6B B3 DF 2B EB 05 8E DC
20 51 3E BB 60 00 FC FC 3A BD C3 7F 51 D7 7E E2
05 CB 92 39 DE 51 D0 6B B5 E2 0F 40 5E E7 81 9C
A4 5D E0 E3 C4 5D 1C 1F FE E0 DF 60 AF 37 A1 82
7C 51 A0 2A A2 00 70 41 17 E2 7F 01 49 05 FE 9D
EF E6 BE D8 2B BB A2 C7 D5 5B 7D A7 7A 6C DC 25
A6 01 26 15 04 01 56 54 13 E3 29 55 5A E6 D7 C8
21 E8 56 66 0A 53 F4 A1 DF 08 89 06 A5 64 55 23
```

* Có 1 file zip được đặt password, file này lưu flag, xuất hiện tại stream thứ 65

  * Stream thứ 65

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FAUN85xkj4kdkOmMZvnwG%2Fimage.png?alt=media&amp;token=7e3e9493-b1a7-4809-b192-1b558108629a" alt=""><figcaption></figcaption></figure>

  * Nội dung file sau khi được decrypt

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FEgwfMpcV1c5ttoVTGj59%2Fimage.png?alt=media&amp;token=6db03318-08c5-42cb-ae31-ce28a74a4b66" alt=""><figcaption></figcaption></figure>
* Password được encode base64, xuất hiện tại stream 74

  * Stream thứ 74:

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FmEWp1ficRjbVo1AkpoM7%2Fimage.png?alt=media&amp;token=258c0488-8147-4a49-93de-2b33808d1640" alt=""><figcaption></figcaption></figure>

  * Nội dung sau khi được decrypt:

  <pre data-overflow="wrap"><code>{"fc":"RW1haWw6IEJvcm5Ub1J1biE3NQ0KQmFuazogVGhlUml2ZXIjIzE5ODANCkNvbXB1dGVyTG9naW46IFRoZUJvc3NNYW4NCk90aGVyOiBUaGVCaWdNQG4xOTQyIQ0K","sta":"success"}
  </code></pre>

  * Giá trị "fc" được encode base64, sau khi decode thì được:

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FcZcmrn3OEowmHp6MsR6t%2Fimage.png?alt=media&amp;token=56b269fc-b3e0-4866-9da0-7a24dc9e0281" alt=""><figcaption></figcaption></figure>

Với password là `TheBigM@n1942!`, mình đã giải nén thành công file zip và lấy được flag.

Nội dung file `guitar_sax_flag.jpg`&#x20;

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FUz9Va4nK0LGXRPwLeJ9l%2Fguitar_sax_flag.jpg?alt=media&amp;token=31744888-0101-496b-b827-b2a03cb968f0" alt=""><figcaption></figcaption></figure>

***Flag:*** `C4N7_ST4R7_A_FLAR3_WITHOUT_4_$PARK@FLARE-ON.com`
