TryHackMe W1seGuy writeup (zh-TW)

題目資訊
- 平台: TryHackMe
- 房間名稱: W1seGuy
- 難度: Easy
- 目標: 獲取 flag1、flag2
- 連結: https://tryhackme.com/room/w1seguy
- 備註: 此篇不同於其他writeup,我主要希望解釋相關概念
題目概述
一個TCP 服務運行在 port 1337,每次連線都會給你一段加密訊息,並要求你破解密鑰,題目有提供明碼檔案source-1705339805281.py
,可以先研究,這個挑戰有兩個 flag 需要取得。
初步偵查
連線到服務後會看到:
└─$ nc 10.201.99.19 1337
This XOR encoded text has flag 1: 1d7f020e1c7856231b180c4f3b34183d032c1e0f08593d460d257b361d393b433645193b4f000711
What is the encryption key?
🔍 識別編碼格式
為什麼知道是十六進位(HEX)?
觀察密文特徵:
- 字元範圍:只包含
0-9
和a-f
,沒有其他字元 - 長度特性:總長度是偶數(每 2 位代表 1 個 byte)
實例對照:
HEX → 十進位 → ASCII字元
54 → 84 → 'T'
48 → 72 → 'H'
4D → 77 → 'M'
7B → 123 → '{'
關鍵發現
從題目提供的原始碼source-1705339805281.py
可以觀察到:
- 密鑰長度固定為 5 個字元
- 密鑰由英文字母和數字隨機組成
- 使用循環 XOR 加密(密鑰會重複使用)
- Flag 格式遵循標準
THM{...}
格式
XOR 加密原理
基礎概念
XOR(互斥或)最重要的特性是可逆性:
如果 A ⊕ B = C
那麼 C ⊕ B = A
同時 C ⊕ A = B
循環加密範例
讓我用簡單例子說明:
明文: THM{OK} (7個字元)
密鑰: ABC (3個字元)
加密過程:
位置: 0 1 2 3 4 5 6
明文: T H M { O K }
密鑰: A B C A B C A (循環)
⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕
密文: ? ? ? ? ? ? ?
攻擊方法:已知明文攻擊
核心概念
既然我們知道:
- 所有 flag 都以
THM{
開頭(4 個字元) - 所有 flag 都以
}
結尾(1 個字元) - 密鑰長度是 5
我們可以利用 XOR 的可逆性:
密鑰 = 密文 ⊕ 明文
破解步驟詳解
Step 1: 處理 HEX 密文
原始密文:122939363f...
兩位一組:12 29 39 36 3f ...
轉換成 bytes:0x12, 0x29, 0x39, 0x36, 0x3f ...
Step 2: 計算密鑰
已知明文開頭:"THM{"
對應 ASCII:T(0x54), H(0x48), M(0x4D), {(0x7B)
計算:
Key[0] = 0x12 ⊕ 0x54 = ?
Key[1] = 0x29 ⊕ 0x48 = ?
Key[2] = 0x39 ⊕ 0x4D = ?
Key[3] = 0x36 ⊕ 0x7B = ?
Key[4] = 密文最後byte ⊕ '}'(0x7D)
Step 3: 為什麼能用最後一個字元?
- 假設 flag 長度是 41
- 位置 40 使用 Key[40 % 5] = Key[0]
- 最後的
}
對應的位置能告訴我們 Key[4]
取得兩個 Flag
Flag 1:解密的獎勵
- 使用破解出的 5 字元密鑰
- 對flag 1密文進行 XOR 解密
- 得到 Flag1:
THM{Redacted}
Flag 2:自動化的證明
- 將正確的密鑰送回伺服器
- 伺服器驗證成功後直接給你
- 得到 Flag2:
THM{Redacted}
實戰破解! XOR 密文 - 詳細步驟
給定密文
1d7f020e1c7856231b180c4f3b34183d032c1e0f08593d460d257b361d393b433645193b4f000711
Step 1:理解資料格式
密文(HEX):1d7f020e1c7856231b180c4f3b34183d032c1e0f08593d460d257b361d393b433645193b4f000711
長度:82 個字元 = 41 個 bytes(82÷2)
兩位一組看:
1d 7f 02 0e 1c 78 56 23 1b 18 0c 4f 3b 34 18 3d 03 2c 1e 0f 08 59 3d 46 0d 25 7b 36 1d 39 3b 43 36 45 19 3b 4f 00 07 11
Step 2:提取關鍵位置
前 5 個 bytes:1d 7f 02 0e 1c
最後 1 個 byte:11
Step 3:計算密鑰
已知資訊
- 明文開頭:
THM{
- 明文結尾:
}
- 對應 ASCII 值:
字元 | ASCII (十進位) | ASCII (十六進位)
T | 84 | 0x54
H | 72 | 0x48
M | 77 | 0x4D
{ | 123 | 0x7B
} | 125 | 0x7D
XOR 計算
使用公式:密鑰 = 密文 ⊕ 明文
Key[0] = 0x1d ⊕ 0x54 = ?
Key[1] = 0x7f ⊕ 0x48 = ?
Key[2] = 0x02 ⊕ 0x4D = ?
Key[3] = 0x0e ⊕ 0x7B = ?
Key[4] = 0x11 ⊕ 0x7D = ?
手動計算 XOR
Key[0] = 0x1d ⊕ 0x54
0x1d = 0001 1101
⊕ 0x54 = 0101 0100
───────────────
= 0100 1001 = 0x49 = 73 = 'I'
Key[1] = 0x7f ⊕ 0x48
0x7f = 0111 1111
⊕ 0x48 = 0100 1000
───────────────
= 0011 0111 = 0x37 = 55 = '7'
Key[2] = 0x02 ⊕ 0x4D
0x02 = 0000 0010
⊕ 0x4D = 0100 1101
───────────────
= 0100 1111 = 0x4F = 79 = 'O'
Key[3] = 0x0e ⊕ 0x7B
0x0e = 0000 1110
⊕ 0x7B = 0111 1011
───────────────
= 0111 0101 = 0x75 = 117 = 'u'
Key[4] = 0x11 ⊕ 0x7D
0x11 = 0001 0001
⊕ 0x7D = 0111 1101
───────────────
= 0110 1100 = 0x6c = 108 = 'l'
Step 4:得到密鑰
密鑰 = I7Oul
Step 5:驗證(解密整個密文)
使用密鑰 I7Oul
循環解密:
位置 | 密文 | 密鑰 | 結果
-----|------|------|------
0 | 0x1d | I(49)| 0x1d ⊕ 0x49 = 0x54 = 'T' ✓
1 | 0x7f | 7(37)| 0x7f ⊕ 0x37 = 0x48 = 'H' ✓
2 | 0x02 | O(4F)| 0x02 ⊕ 0x4F = 0x4D = 'M' ✓
3 | 0x0e | u(75)| 0x0e ⊕ 0x75 = 0x7B = '{' ✓
4 | 0x1c | l(6c)| 0x1c ⊕ 0x6c = 0x70 = 'p'
5 | 0x78 | I(49)| 0x78 ⊕ 0x49 = 0x31 = '1'
...(繼續解密)
40 | 0x11 | I(49)| 0x11 ⊕ 0x6c = 0x7D = '}' ✓
nc 10.201.99.19 1337
This XOR encoded text has flag 1: 1d7f020e1c7856231b180c4f3b34183d032c1e0f08593d460d257b361d393b433645193b4f000711
What is the encryption key? I7Oul
Congrats! That is the correct key! Here is flag 2: THM{Redacted}
線上輔助工具:
XOR Calculator Online
Calculate the exclusive or (XOR) with a simple web-based calculator. Input and output in binary, decimal, hexadecimal or ASCII.
Decimal to ASCII Converter (dec to ascii)
