前言
第一题做的挺快的,直接动态调试转伪代码就出了,然后接下来就一直坐牢了,babypython本来听说gpt4可以直接输入上万行分析,结果感觉和gpt3的差距也不大,字节码太多了,无从下手😥
字节码分析
根据OrientalGlass师傅说只需要管flag相关区域就行,刚才看了下确实如此,跟着flag和output符号可以定位出主要算法区域
字节码翻译事实上比汇编感觉要简单得多,完全面向栈编程的,调用函数出栈,load入栈,明白了这个后大部分都可以看懂
https://www.yuque.com/zhao.ming.tai.zi/ksmo0g/trma9l
这段代码可以翻译为
flag ='********************************'
value =''
output =''
temp =flag[i]
for i in range(len(flag)):
value +=chr(ord(temp) ^8)
这一部分对x,y,z做了一些加减乘除后并未改变前面参数的值也没有参与后面的运算,发现下面也有一行字符串说明不会运行
for _ in range(len(flag)):
temp =value[i]
output +=chr(ord(temp) +3)
然后后面又出现了一堆没用的东西虽然对output取值了,但并未改变原有值和用到
这一部分有点难理解,但知道用到了base64加密,用gpt翻译了一下为
下面是将给定的字节码片段还原为相应的 Python 代码:
import base64
output = base64.b64encode(output.encode()).decode()
obfuscated_output = obfuscated_output[::-1]
obfuscated_output = obfuscated_output.replace('g', '1').replace('H', '3').replace('W', '9')
invalid_variable = len(obfuscated_output) * 5
print(obfuscated_output)
根据字节码的内容,可以看出它实现了以下功能:
- 将
output
进行 Base64 编码,并将结果转为字符串。 - 对
obfuscated_output
进行翻转(逆序)操作。 - 对
obfuscated_output
中的字符进行替换操作,将字符 ‘g’ 替换为 ‘1’,‘H’ 替换为 ‘3’,‘W’ 替换为 ‘9’。 - 根据
obfuscated_output
的长度乘以 5,得到invalid_variable
的值。 - 打印
obfuscated_output
。
翻到最后一行发现给出了结果:
=1nb0A3b7AUQwB3b84mQ/E0MvJUb+EXbx5TQwF3bt52bAZncsd9c
当时还在想为什么加密字符串是倒着的
wp
import base64
flag ='=1nb0A3b7AUQwB3b84mQ/E0MvJUb+EXbx5TQwF3bt52bAZncsd9c'
flag =flag[::-1]
#print(flag)
flag =flag.replace('1', 'g').replace('3', 'H').replace('9', 'W')
flag = base64.b64decode(flag.encode()).decode()
temp =''
output =''
for i in range(len(flag)):
temp =flag[i]
output +=chr(ord(temp) -3)
value =''
for i in range(len(flag)):
temp =output[i]
value +=chr(ord(temp) ^8)
print(value)
flag{5dcbafe63fbf3b7d8647c1aee650ae9c}
参考链接:
OrientalGlass