1.elf z3暴力破解·改
可通过如下代码
"前面需要输入条件"
f=Solver()
print(f.model)
可以查找自己所输入的条件
通过对z3的检验发现自己出现了个python的低级常识性错误
for循环时range输出的可遍历对象实际是小于该对象的
如range(10)其应该是<10
所以经过对遍历对象的修改
真正的z3代码应该如下
from z3 import *
DataCmp=[
161, 186, 110, 70, 128, 244, 217, 170, 180, 54, 90,
204, 140, 30, 149, 33, 143, 67, 225, 19, 138, 168, 106,
66, 174, 251, 247, 165, 157, 11, 75, 222, 186, 0, 135,
35, 144, 70, 211, 223]
flag = [BitVec('flag[%2d]' % i, 8) for i in range(40)] #初始化序列
out=[0]*40
for i in range(40):
out[i]=flag[i]
v1=-85
v2=0 #创建约束求解器
for i in range(40):
for j in range(51):
v1^=j^v2^0x5f
out[i]^=flag[(i+1)%40]
out[i]^=v1
v2+=1
f = Solver()
for i in range(39):
f.add(out[i]==DataCmp[i])
while(f.check()==sat):
condition = []
m = f.model()
p=""
for i in range(40):
p+=chr(int("%s" % (m[flag[i]])))
condition.append(flag[i]!=int("%s" % (m[flag[i]])))
print(p)
f.add(Or(condition))
在输出结果内找到了对应的正确的flag
只不过对其增加条件时可能找不到正确的解,非常奇怪