BUUCTF 逆向题目 [GWCTF 2019]pyre
题目地址:
https://buuoj.cn/challenges#[GWCTF%202019]pyre
https://files.buuoj.cn/files/c8a50a9c864596bd765eec41e4fe2220/attachment.pyc
pyc文件逆向py文件
Python反编译工具探索
反编译工具是指可以将已经编译好的程序(如可执行文件或库)还原成源代码的工具。它可以使开发者们更方便地理解和修改某个程序的运行逻辑,也可以帮助安全研究人员进行漏洞分析。
在Python领域中,反编译工具同样有很多应用。下面我们将介绍三种常用的Python反编译工具。
uncompyle6工具
uncompyle6是一种非常流行的Python反编译工具,它可以将Python编译后的.pyc文件还原成Python源码。下面是uncompyle6的使用示例:
python -m pip install uncompyle6
# 反编译单个.pyc文件
python -m uncompyle6 test.pyc -o test.py
# 反编译整个目录下的所有.pyc文件
python -m uncompyle6 *.pyc -o output
uncompyle6是Python比较流行的反编译工具之一。使用它反编译pyc文件通常只需要一行简单的命令。
当我们运行上述命令后,pycdc会将.pyc文件转换成Python源代码,并输出到控制台中。
pycdc工具
pycdc是另一种常用的Python反编译工具,它可以将Python 3编译后的.pyc文件还原成Python源码。下面是pycdc的使用示例:
python -m pip install pycdc
# 反编译单个.pyc文件
python -m pycdc -d dir test.pyc
pycdc则是一个更为高级的反编译工具,它不仅可以还原AST,还可以实现代码格式化等优化操作。但需要注意的是,pycdc目前还不支持Python 3以上版本。
unpyc37
unpyc37比较新,是一个专门针对Python 3.7以上版本的反编译工具。它的还原速度较慢,但能够对源码进行较为完整和准确的还原。
https://github.com/greyblue9/unpyc37-3.10
unpyc.unpyc3
python -m pip install .
python -m unpyc.unpyc3 test.pyc -o output
python3 -m unpyc.unpyc3 FILE.pyc [start [end]]
FILE.pyc is the path to the
file to decompile
start is 0 by default
end is -1 by default
除此之外,最方便的还是在线pyc逆向
https://www.lddgo.net/string/pyc-compile-decompile
注意:这个识别没问题,推荐!!!
https://tool.lu/pyc/
注意:这个识别有点瑕疵,慎用!!!
# Visit https://www.lddgo.net/string/pyc-compile-decompile for more information
# Version : Python 2.7
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
'x1f',
'x12',
'x1d',
'(',
'0',
'4',
'x01',
'x06',
'x14',
'4',
',',
'x1b',
'U',
'?',
'o',
'6',
'*',
':',
'x01',
'D',
';',
'%',
'x13']
因为看起来有点乱。而且我用的是Python3的原因。所以手工调节一下
# 定义输入字符串
input1 = 'YourInputString'
# 打印欢迎消息
print('Welcome to Re World!')
print('Your input1 is your flag~')
# 计算输入字符串的长度
l = len(input1)
# 初始化一个空列表来存储计算后的代码值
code = []
# 遍历输入字符串的每个字符
for i in range(l):
# 计算每个字符的新值
num = ((ord(input1[i]) + i) % 128 + 128) % 128
# 将计算后的值添加到代码列表中
code.append(num)
# 遍历代码列表,对相邻两个元素进行异或操作
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
# 打印最终的代码值
print(code)
code = [
'x1f',
'x12',
'x1d',
'(',
'0',
'4',
'x01',
'x06',
'x14',
'4',
',',
'x1b',
'U',
'?',
'o',
'6',
'*',
':',
'x01',
'D',
';',
'%',
'x13']
这题需要反过来推,所以我们从下往上看。
第一步: 首先是异或的部分
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
这里我们需要了解一下异或的特性,即当两个相等的数进行异或的时候则会变成0.比如:7 ^ 7 = 0 。假设
code = [ A, B, C, D, E ]
则经过异或加工后为:
code = [ A^B, B^C, C^D, D^E, E ]
元素反转过来
code 反转 =
所以如果想要变成原来的code,则需要和原来的值进行异或,并且是从后往前推:
code = [ A^B^B, B^C^C, C^D^D, D^E^E, E ]
等价于
code = [ A, B, C, D, E ]
具体的写法是(Python3代码):
# 反向操作:对相邻两个元素进行异或操作
for i in range(len(code) - 2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
第二步: 这里再把+好变成-号就可以了
# 遍历输入字符串的每个字符
for i in range(l):
# 计算每个字符的新值
num = ((ord(input1[i]) + i) % 128 + 128) % 128
# 将计算后的值添加到代码列表中
code.append(num)
即
for i in range(len(code)):
original_value = ((ord(code[i]) - i) % 128 + 128) % 128
decoded_chars.append(chr(original_value))
再把后面的多余的部分化简一下(也可以不化简)
for i in range(len(code)):
original_value = (ord(code[i]) - i) % 128
decoded_chars.append(chr(original_value))
所以最终获取flag的脚本(Python3代码):
# 已知的code列表
code = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4',
',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
# 反向操作:对相邻两个元素进行异或操作
for i in range(len(code) - 2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
# 初始化一个空列表来存储解密后的字符
decoded_chars = []
# 对解密后的值进行逆向计算得到原始的ASCII码,并转换为字符
for i in range(len(code)):
original_value = (ord(code[i]) - i) % 128
decoded_chars.append(chr(original_value))
# 得到最终的输入字符串
input1_decoded = ''.join(decoded_chars)
# 打印最终的结果
print('Decoded input1:', input1_decoded)
def decode_code(code):
for x in range(len(code) - 2, -1, -1): # 从后往前遍历,并且倒数第一个不需要异或操作
code[x] = chr(ord(code[x]) ^ ord(code[x + 1]))
flag = ""
for i in range(len(code)):
num = ((ord(code[i]) - i) + 128) % 128
flag += chr(num)
return flag
# Input code
code = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4',
',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
# Decode and output the result
result = decode_code(code)
print(result)
def process_code(input_code):
# Reverse the list to simplify the loop
input_code.reverse()
for i in range(1, len(input_code)):
input_code[i] = chr(ord(input_code[i]) ^ ord(input_code[i - 1]))
# Reverse the list back to its original order
input_code.reverse()
output_code = ""
for i in range(len(input_code)):
output_code += chr((ord(input_code[i]) - i) % 128)
return output_code
# Input code
code = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4',
',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
# Process and output the result
result = process_code(code)
print(result)
flag{Just_Re_1s_Ha66y!}
原文始发于微信公众号(利刃信安攻防实验室):【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论