我具有以下函数,该函数接受输入字符串和数字以生成哈希,如下所示:
#! /usr/bin/python
def calc_hash(key, num):
result = 0
for i in range(len(key)):
result = (ord(key[i]) + result * 10 - 0x30) % num
return result
if __name__ == "__main__":
print hex(calc_hash("you_must_check_this_out", 0x1A5D215))
因此,如果输入字符串是:“ you_must_check_this_out”,数字是:0x1A5D215,则输出将是:0x7cda66
目标是找到一个满足以下条件的输入字符串:
calc_hash(input, 0x1A5D215) == 0xd5
calc_hash(input, 0x28DB) == 0xe5
calc_hash(input, 0x5d1) == 0x19
calc_hash(input, 0xff7ff) == 0x53
calc_hash(input, 0x3eff) == 0x87
我不知道输入字符串的长度,但是对长度的限制是它应该小于或等于30
len(input) <= 30
因此,我编写了以下代码以使用Z3查找解决方案,但是它不起作用。
#! /usr/bin/python
import sys
from z3 import *
def calc_hash(input, num):
result = 0
for i in range(len(input)):
result = (ZeroExt(56, input[i]) + result * 10 - 0x30) % num
return result
if __name__ == "__main__":
s = Solver()
input = [BitVec("input%s" % i, 8) for i in range(10)]
for i in range(10):
s.add(input[i] >= 0x20)
s.add(input[i] <= 0x7E)
s.add(calc_hash(input,0x1A5D215) == 0xd5)
s.add(calc_hash(input,0x28DB) == 0xe5)
s.add(calc_hash(input,0x5d1) == 0x19)
s.add(calc_hash(input,0xff7ff) == 0x53)
s.add(calc_hash(input,0x3eff) == 0x87)
print s.check()
print s.model()
可以在代码中更改输入的长度以尝试不同的长度。
上面的代码是否有问题?