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))

image
在输出结果内找到了对应的正确的flag
只不过对其增加条件时可能找不到正确的解,非常奇怪

posted @ 2023-01-04 22:06  润梧  阅读(36)  评论(0编辑  收藏  举报