> ## Content Index
> Fetch the complete content index at: https://taiwanding.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# TryHackMe W1seGuy writeup (zh-TW)
- URL: https://taiwanding.com/tryhackme-w1seguy-writeup-zh-tw/
- Published: 2025-09-18T08:21:54.000Z
- Updated: 2026-07-15T02:49:50.000Z
- Author: Kevin Chen
- Tags: tryhackme, CTF, crypto

## 題目資訊

- **平台**: TryHackMe
- **房間名稱**: W1seGuy
- **難度**: Easy
- **目標**: 獲取 flag1、flag2
- **連結**: [https://tryhackme.com/room/w1seguy](https://tryhackme.com/room/w1seguy?ref=taiwanding.com)
- 備註: 此篇不同於其他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）？

觀察密文特徵：

1. **字元範圍**：只包含 `0-9` 和 `a-f`，沒有其他字元
2. **長度特性**：總長度是偶數（每 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：解密的獎勵

1. 使用破解出的 5 字元密鑰
2. 對flag 1密文進行 XOR 解密
3. 得到 Flag1：`THM{Redacted}`

### Flag 2：自動化的證明

1. 將正確的密鑰送回伺服器
2. 伺服器驗證成功後直接給你
3. 得到 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 = '}' ✓

```

```bash
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 OnlineCalculate the exclusive or (XOR) with a simple web-based calculator. Input and output in binary, decimal, hexadecimal or ASCII.![](https://taiwanding.com/content/images/icon/favicon-2.ico)](https://xor.pw/?ref=taiwanding.com)

[Decimal to ASCII Converter (dec to ascii)![](https://taiwanding.com/content/images/icon/favicon-3.ico)PrePost SEO![](https://taiwanding.com/content/images/thumbnail/decimal-to-ascii.png)](https://www.prepostseo.com/tool/decimal-to-ascii?ref=taiwanding.com)