這是題目,下載后得到一個python文件,打開
解讀代碼:
for i in range(len(list)):key = (list[i]>>4)+((list[i] & 0xf)<<4)result += str(hex(ord(flag[i])^key))[2:].zfill(2)
list[i]>>4:從列表中取數字同時高4位向右位移4位;
(list[i] & 0xf):取數字進行保留低四位;因為0xf轉換為二進制是0000 1111,與之按位與就會只保留低四位;
((list[i] & 0xf)<<4):保留低4位后向左位移4位;
(list[i]>>4)+((list[i] & 0xf)<<4):高四位右移,低四位左移,故相當于高低4位調換位置;
(flag[i])^key):flag字符串的對應字符與高低四位調換后的值進行異或操作;
(ord(flag[i])^key):將異或后的值轉換為ascll碼值;
ord() 是 Python 內置函數,用于將單個 Unicode 字符轉換為對應的整數值(Unicode 碼點)。這個函數是字符串處理和編碼轉換的基礎工具。
函數定義
python
運行
ord(c)參數:c 是一個長度為 1 的字符串(單個 Unicode 字符)
返回值:對應的 Unicode 碼點整數值
核心功能
字符轉整數:將單個字符轉換為對應的數字表示
ASCII 轉換:對 ASCII 字符,返回對應的 ASCII 碼值(0-127)
Unicode 支持:支持所有 Unicode 字符(0-0x10FFFF)
hex(ord(flag[i])^key):將轉換后的ascll碼值轉換為16進制;
str(hex(ord(flag[i])^key)):將該16進制的ascll碼值轉換為字符串;
str(hex(ord(flag[i])^key))[2:]:去除16進制字符串開頭的0x得到純16進制ascll碼值;
str(hex(ord(flag[i])^key))[2:].zfill(2):在字符串左側補0;
zfill() 是 Python 字符串對象的內置方法,用于在字符串左側填充指定數量的零('0'),使字符串達到指定的寬度。這在需要格式化數字、日期或創建固定寬度字符串時非常有用。
方法定義
python
運行
string.zfill(width)參數:width 是目標字符串的總長度
返回值:左側用零填充后的新字符串
核心功能
左側補零:在字符串左側填充 '0',直到達到指定寬度
保留符號:如果字符串以 '+' 或 '-' 開頭,符號會保留在最左側`在這里插入代碼片`
不截斷:如果原字符串長度已超過或等于指定寬度,則返回原字符串
result += str(hex(ord(flag[i])^key))[2:].zfill(2):賦值給result變量并拼接。
接下來寫逆向腳本:
result='bcfba4d0038d48bd4b00f82796d393dfec'
keys = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
flag=''
hex_pairs = [result[i:i+2] for i in range(0, len(result), 2)]for i in range(len(keys)):# 對列表元素進行相同的位運算(高低4位交換)key = (keys[i] >> 4) + ((keys[i] & 0xf) << 4)# 將十六進制字符串轉回整數hex_value = int(hex_pairs[i], 16)# 異或操作char_code = hex_value ^ key# 轉換為字符并拼接flag += chr(char_code)print("解密后的flag:", flag)
運行得到:
提交:
逆向代碼解析:首先回顧一下原代碼的加密邏輯,
1.將list中的數字高低四位調換位置,所以解密時key應該也進行這個操作:
key = (keys[i] >> 4) + ((keys[i] & 0xf) << 4)
2.把flag中的字符轉換為16進制,所以需要先按兩個字節進行分割,再轉換回10進制的ascll碼值:
hex_pairs = [result[i:i+2] for i in range(0, len(result), 2)]
hex_value = int(hex_pairs[i], 16)
3.把falg中的字符與key進行異或操作,所以逆向代碼中,result的值再次異或即可得到flag的ascll碼值
char_code = hex_value ^ key
4.轉換為字符并拼接:flag += chr(char_code)
chr() 是 Python 的內置函數,用于將整數轉換為對應的 Unicode 字符。它與 ord() 函數互為逆操作,形成字符和數字之間的雙向轉換橋梁。
函數定義
python
運行
chr(i)參數:i 是一個范圍在 0 到 1,114,111(即 0x10FFFF)之間的整數
返回值:對應的 Unicode 字符
核心功能
整數轉字符:將 Unicode 碼點轉換為對應的字符
ASCII 支持:對 ASCII 范圍內的值(0-127),返回對應的 ASCII 字符
全 Unicode 支持:支持所有合法的 Unicode 字符(包括非 ASCII 字符、表情符號等)
完結撒花