使用 z3 进行逆向 解密字符串
2024-10-19 14:52:22
在逆向过程中,我们知道了一个结果值,和一段计算代码。这个时候我们需要知道计算前的值是什么;需要用到 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
最新文章
- 帮助你提高排版技巧的18个 PS 文字特效教程
- Tesseract-OCR引擎 入门
- 解决Ubuntu不能挂载ntfs格式硬盘
- openerp学习笔记 context 的应用
- SQL复制表及表结构
- ASP清除字串中的重复字符
- string.Join和Reverse的简单使用示例
- 事后调试之MiniDump转储
- Android ProgressDialog 加载进度
- CGBitmapContextCreate函数
- SSAS系列——【03】多维数据(多维数据集对象)
- BNU OJ 50997 BQG&#39;s Programming Contest
- 基于Spring Security 的JSaaS应用的权限管理
- [转]map函数补充
- 分布式基础通信协议:paxos、totem 和 gossip(转载)
- Docker折腾手记-linux下安装
- Log4j源码分析
- android hook native函数
- dj 中间件
- Andrew Ng-ML-第八章-正则化
热门文章
- 初识GDAL
- Gitlab(1)- 简单介绍
- vue父组件中调用子组件的方法
- 小程序跳转H5及其他页面
- JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
- Jmeter系列(22)- 常用逻辑控制器(1) | 随机控制器Random Controller
- Django边学边记—新手Django建项目各流程细节
- windows 根据 端口号 找到进程ID PID
- 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03
- 牛客挑战赛48C-铬合金之声【Prufer序列】