【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

admin 2023年12月7日08:52:02评论8 views字数 4481阅读14分56秒阅读模式

BUUCTF 逆向题目 [GWCTF 2019]pyre

题目地址:

https://buuoj.cn/challenges#[GWCTF%202019]pyre

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

https://files.buuoj.cn/files/c8a50a9c864596bd765eec41e4fe2220/attachment.pyc

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

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源代码,并输出到控制台中。

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

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

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

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 decompilestart is 0 by defaultend is -1 by default

除此之外,最方便的还是在线pyc逆向

https://www.lddgo.net/string/pyc-compile-decompile

注意:这个识别没问题,推荐!!!

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

https://tool.lu/pyc/

注意:这个识别有点瑕疵,慎用!!!【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

# 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 codecode = [ '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 反转 = [ E, D^E, C^D, B^C, A^B ]

所以如果想要变成原来的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)

# 对解密后的值进行逆向计算得到原始的ASCII码,并转换为字符for i in range(len(code)):    original_value = ((ord(code[i]) - i) % 128 + 128) % 128    decoded_chars.append(chr(original_value))

再把后面的多余的部分化简一下(也可以不化简)

# 对解密后的值进行逆向计算得到原始的ASCII码,并转换为字符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)

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

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 codecode = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4', ',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
# Decode and output the resultresult = decode_code(code)print(result)

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

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 codecode = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4', ',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
# Process and output the resultresult = process_code(code)print(result)

【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

flag{Just_Re_1s_Ha66y!}

原文始发于微信公众号(利刃信安攻防实验室):【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyre

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月7日08:52:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【逆向分析】BUUCTF 逆向题目 [GWCTF 2019]pyrehttps://cn-sec.com/archives/2275176.html

发表评论

匿名网友 填写信息