一道簡單的[[rust逆向]]
#rust逆向 #位運算
題目信息
- 文件名:ezrust.exe
題目附件:https://wwfj.lanzoul.com/iczMR30k5j4h
密碼:bueq
題目分析
1. 初步分析
這是一道Rust編寫的逆向題目。通過IDA分析可以看到,這是一個典型的flag驗證程序。
2. 程序流程分析
程序的主要邏輯在sub_140002220
函數中,讓我們逐步分析:
- 用戶輸入:程序首先輸出提示信息"please input your flag:",要求用戶輸入flag
- 長度檢查:程序檢查輸入的長度是否為23字符
- 字符處理:對輸入的每個字符進行特殊的位運算處理
- 比較驗證:將處理后的結果與硬編碼的目標數組進行比較
3. 核心算法分析
通過分析反編譯代碼,我們可以看到程序對輸入進行了如下處理:
// 偽代碼邏輯
for each character in input:v13 = character >> 4 // 右移4位v9 = 16 * ((character & 15) ^ 8) // 低4位異或8后乘以16result = v9 + (v13 ^ 9) // 組合結果
具體分析:
sub_140002AE0(v29, 4)
實現右移4位操作,提取高4位sub_140002B30(v12, 15)
實現與15的按位與操作,提取低4位- 然后進行異或和移位運算的組合
4. 目標數組分析
程序中硬編碼了一個23字節的目標數組:
[-82, -36, -66, -50, 124, -102, -66, 124, -115, 124, -66, -115, -17, -70, 124, -102, -97, 111, -1, -34, -97, -1, -33]
轉換為無符號字節:
[174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]
5. 逆向算法推導
從算法分析可以看出,對于輸入字符c:
- 取高4位:
high = c >> 4
- 取低4位:
low = c & 15
- 計算:
result = 16 * (low ^ 8) + (high ^ 9)
要逆向這個過程,我們需要:
- 對于目標值target,求解原始字符c
- 設
x = target // 16
,y = target % 16
- 則
low ^ 8 = x
,high ^ 9 = y
- 所以
low = x ^ 8
,high = y ^ 9
- 原始字符
c = high * 16 + low
解題腳本
def solve_ezrust():# 目標數組(程序中硬編碼的期望結果)target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]flag = ""for target_byte in target:# 暴力搜索:對每個目標字節,嘗試所有可能的ASCII字符for char_val in range(32, 127): # 可打印ASCII范圍# 模擬程序的加密算法high_4_bits = char_val >> 4 # 提取高4位low_4_bits = char_val & 0x0F # 提取低4位# 核心算法:result = 16 * (low ^ 8) + (high ^ 9)encrypted = 16 * (low_4_bits ^ 8) + (high_4_bits ^ 9)if encrypted == target_byte:flag += chr(char_val)breakreturn flag# 驗證函數
def verify_algorithm(char):"""驗證加密算法"""char_val = ord(char)high = char_val >> 4low = char_val & 15result = 16 * (low ^ 8) + (high ^ 9)return resultif __name__ == "__main__":flag = solve_ezrust()print(f"Flag: {flag}")# 驗證結果target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]print("\n驗證結果:")for i, char in enumerate(flag):calculated = verify_algorithm(char)expected = target[i]status = "?" if calculated == expected else "?"print(f"字符 '{char}' (ASCII {ord(char)}) -> {calculated} (期望 {expected}) {status}")# 檢查是否所有字符都匹配all_match = all(verify_algorithm(char) == target[i] for i, char in enumerate(flag))print(f"\n整體驗證結果: {'成功' if all_match else '失敗'}")
運行結果
運行解題腳本后得到flag:
Flag: rUst_1s_@_s@f3_1anguage