> ## 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.

# 西電 CTF 終端 - Python writeup (zh-TW)
- URL: https://taiwanding.com/xi-dian-ctf-zhong-duan-python-writeup-zh-tw/
- Published: 2025-10-23T03:54:39.000Z
- Updated: 2025-11-03T09:09:19.000Z
- Author: Kevin Chen
- Tags: #xidian, CTF, #misc, crypto

## 題目資訊

- **分類**: 安全雜項/計算機基礎
- **描述**: Python是CTF中最常用的编程语言，不管是学习哪个方向都离不开Python。本题你需要配置一个能够编译运行Python程序的环境，并且运行题目给出的代码来获取flag。
- **附件**: Python.py
- 題目連結: [https://ctf.xidian.edu.cn/training/13?challenge=488](https://ctf.xidian.edu.cn/training/13?challenge=488&ref=taiwanding.com)

## 解題過程

### Step 1: 查看源代碼

```python
def rol(x):
    return ((x >> 3) | (x << 5)) & 0xff

enc = [233, 184, 152, 112, 248, 104, 137, 129, 168, 41, 136, 96, 82, 153, 217, 2, 217, 114, 28, 184]
key = 'Python'
flag = ''

僅列出部分程式碼~
```

🔍 **關鍵發現**：

- 這是一個解密腳本
- 使用三層解密：ROL → 減法 → XOR
- 密鑰是 `'Python'`，循環使用

### Step 2: 理解 ROL 函數

ROL (Rotate Right) - 循環右移 3 位：

```python
def rol(x):
    return ((x >> 3) | (x << 5)) & 0xff

```

**運作原理**：

```
原始: 11101001 (233)
右移3: 00011101 (29)  ← 右邊掉出的 3 位
左移5: 00100000 (32)  ← 把掉出的位元移回左邊
合併:  00111101 (61)

```

因為 `3 + 5 = 8`，所以實現了 8 位元的循環移位！

### Step 3: 手動解密一個範例

以 `enc[0] = 233` 為例：

**① ROL 循環右移**

```
原始: 11101001 (233)
右移3: 00011101 (29)  ← 右邊掉出的 3 位
左移5: 00100000 (32)  ← 把掉出的位元移回左邊
合併:  00111101 (61)
```

**② 減去索引**

```
61 - 0 = 61

```

**③ XOR 密鑰**

```
key[0] = 'P' → ord('P') = 80
61 ^ 80 = 109 → chr(109) = 'm'

```

✅ **第一個字元是 'm'**

### Step 4: 執行腳本

```bash
python3 Python.py

```

🎉 **成功獲得 Flag！**

## 學習重點

### 1\. 循環移位操作

- **ROL (Rotate Left)**: 循環左移
- **ROR (Rotate Right)**: 循環右移

### 2\. 多層加密的逆向思維

**加密流程（反推）**：

```
明文 → XOR密鑰 → 加索引 → ROR → 密文

```

**解密流程（題目給的）**：

```
密文 → ROL → 減索引 → XOR密鑰 → 明文

```

每一步都是可逆的：

- XOR 可逆：`A ^ B ^ B = A`
- 加減可逆：`(A + i) - i = A`
- 移位可逆：ROL ↔ ROR

### 3\. 密鑰循環使用

```python
key = 'Python'  # 6 個字元
key[i % 6]      # 當 i ≥ 6 時會循環回來

```

## 經驗分享

這題可以透過直接運行得到flag，但也希望可以了解其中的原理，仔細討論會發現，這就是一個密碼學中常見的**多層加密**概念。實際應用中，多層加密可以大幅提升破解難度。