使用 z3 进行逆向 解密字符串
在逆向过程中,我们知道了一个结果值,和一段计算代码。这个时候我们需要知道计算前的值是什么;需要用到 z3 模块来进行解题
z3项目地址
Java代码如下:
private String b(String str) {
char[] charArray = str.toCharArray();
for (int i = 0; i < charArray.length; i++) {
charArray[i] = (char) ((charArray[i] >> (i % 8)) ^ charArray[i]);
}
for (int i2 = 0; i2 < charArray.length / 2; i2++) {
char c = charArray[i2];
charArray[i2] = charArray[(charArray.length - i2) - 1];
charArray[(charArray.length - i2) - 1] = c;
}
return new String(charArray);
}
该函数运行结果是: 0064736c707d6f510020646b73247c4d0068202b4159516700502a214d24675100
(可以看出java代码明明是字符串类型的,因为java和python之间的问题,我给转换成了16进制,方便复制)
下面使用 z3 进行解题
from binascii import a2b_hex, b2a_hex
import z3
# a2b_hex ascii编码的十六进制 转 二进制
# b2a_hex 二进制 转 ascii编码的十六进制
def main():
r = '0064736c707d6f510020646b73247c4d0068202b4159516700502a214d24675100'
# 需要先将16进制转换成二进制
r_result = bytearray(a2b_hex(r))
print(r_result)
for i in range(len(r_result) // 2):
c = r_result[i]
r_result[i] = r_result[len(r_result) - i - 1]
r_result[len(r_result) - i - 1] = c
print(b2a_hex(r_result))
# 这是一个求解器
s = z3.Solver()
# 创造多个求解单位
x = [z3.BitVec(f'x{i}', 32) for i in range(len(r_result))]
for i in range(len(r_result)):
# c = r_result[i]
# 根据原有算法, 这个就相当于求方程嘛。
s.add(((x[i] >> (i % 8)) ^ x[i]) == r_result[i])
# 求解成功
if s.check() == z3.sat:
model = s.model()
# print(model)
flag = ''
for i in range(len(r_result)):
# print(model[x[i]])
# if model[x[i]]:
try:
flag += chr(model[x[i]].as_long().real)
except Exception as err:
flag += ' '
print([flag])
else:
print('???')
# [' ay I *P EASE* h ve the assword ']
# ay I *P EASE* h ve the assword
if __name__ == '__main__':
main()
解密结果为: ay I *P EASE* h ve the assword
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】