为了账号安全,请及时绑定邮箱和手机立即绑定

使用 z3 其中约束取决于函数的输出

使用 z3 其中约束取决于函数的输出

芜湖不芜 2021-09-14 15:34:26
我想用 z3 来解决这个案例。输入是一个 10 个字符的字符串。输入的每个字符都是一个可打印字符 (ASCII)。输入应该是这样的,当使用输入作为参数调用 calc2() 函数时,结果应该是:0x0009E38E1FB7629B。在这种情况下如何使用 z3py?通常我只会添加独立方程作为对 z3 的约束。在这种情况下,我不确定如何使用 z3。def calc2(input):    result = 0    for i in range(len(input)):        r1 = (result << 0x5) & 0xffffffffffffffff        r2 = result >> 0x1b        r3 = (r1 ^ r2)        result = (r3 ^ ord(input[i]))    return resultif __name__ == "__main__":        input = sys.argv[1]        result = calc2(input)        if result == 0x0009E38E1FB7629B:             print "solved"更新:我尝试了以下操作,但是它没有给我正确的答案:from z3 import *def calc2(input):    result = 0    for i in range(len(input)):        r1 = (result << 0x5) & 0xffffffffffffffff        r2 = result >> 0x1b        r3 = (r1 ^ r2)        result = r3 ^ Concat(BitVec(0, 56), input[i])    return resultif __name__ == "__main__":    s = Solver()    X = [BitVec('x' + str(i), 8) for i in range(10)]    s.add(calc2(X) == 0x0009E38E1FB7629B)    if s.check() == sat:        print(s.model())
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

您可以在 Z3 中对 calc2 进行编码。您需要将循环展开 1,2,3,4,..,n 次(对于 n = 预期的最大输入大小),仅此而已。(您实际上不需要展开循环,您可以使用 z3py 创建约束)


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信