在逆向过程中,我们知道了一个结果值,和一段计算代码。这个时候我们需要知道计算前的值是什么;需要用到 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

最新文章

  1. 帮助你提高排版技巧的18个 PS 文字特效教程
  2. Tesseract-OCR引擎 入门
  3. 解决Ubuntu不能挂载ntfs格式硬盘
  4. openerp学习笔记 context 的应用
  5. SQL复制表及表结构
  6. ASP清除字串中的重复字符
  7. string.Join和Reverse的简单使用示例
  8. 事后调试之MiniDump转储
  9. Android ProgressDialog 加载进度
  10. CGBitmapContextCreate函数
  11. SSAS系列——【03】多维数据(多维数据集对象)
  12. BNU OJ 50997 BQG&#39;s Programming Contest
  13. 基于Spring Security 的JSaaS应用的权限管理
  14. [转]map函数补充
  15. 分布式基础通信协议:paxos、totem 和 gossip(转载)
  16. Docker折腾手记-linux下安装
  17. Log4j源码分析
  18. android hook native函数
  19. dj 中间件
  20. Andrew Ng-ML-第八章-正则化

热门文章

  1. 初识GDAL
  2. Gitlab(1)- 简单介绍
  3. vue父组件中调用子组件的方法
  4. 小程序跳转H5及其他页面
  5. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
  6. Jmeter系列(22)- 常用逻辑控制器(1) | 随机控制器Random Controller
  7. Django边学边记—新手Django建项目各流程细节
  8. windows 根据 端口号 找到进程ID PID
  9. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03
  10. 牛客挑战赛48C-铬合金之声【Prufer序列】