z3约束器 初探 pwn的z3利用技巧

29 篇文章 0 订阅
本文介绍了如何使用Z3 Python库解决一个包含加法和位操作的加密函数,展示了如何通过建立并求解布尔公式来找到输入变量的解。作者分享了在强网杯竞赛中实际应用Z3求解过程,突出了Z3在密码学问题中的高效解题能力。
摘要由CSDN通过智能技术生成

前言:这里简单记录下,z3的利用技巧,所以这里采用强网杯的一道题,z3很强大,。摸

int show()
{
  unsigned __int64 v1; // [rsp+8h] [rbp-8h]
 
  puts("index:");
  v1 = sub_BEF();
  if ( v1 > 0x10 || !*((_QWORD *)&chunk + 2 * v1) || !qword_202068[2 * v1] )
  {
    puts("error");
    exit(0);
  }
  show_encrypto(**((_DWORD **)&chunk + 2 * v1));
  show_encrypto(*(_DWORD *)(*((_QWORD *)&chunk + 2 * v1) + 4LL));
  return puts("done");
}

show_encrypto:

int __fastcall sub_FCC(unsigned int a1)
{
  int i; // [rsp+1Ch] [rbp-4h]
 
  for ( i = 2; i > 0; --i )                     // 2
    a1 ^= (32 * a1) ^ ((a1 ^ (32 * a1)) >> 17) ^ (((32 * a1) ^ a1 ^ ((a1 ^ (32 * a1)) >> 17)) << 13);
  return printf("%lx\n", a1);
}

我们这里利用z3解出这个方程
z3.py:

def decode(data):
    solver = Solver()
    a1 = BitVec('a1', 32)
    t = a1
    for i in range(2):
        a1 ^= (32 * a1) ^ (LShR((a1 ^ (32 * a1)), 17)) ^ (((32 * a1) ^ a1 ^ (LShR((a1 ^ (32 * a1)), 17))) << 13)
    solver.add(a1 == data) //进行比对
    solver.check()
    ans = solver.model()
    return p32(solver.model()[t].as_long())
 
 
def show(idx):
    choice(4)
    sh.sendlineafter("index:\n", str(idx))
    t1 = sh.recvuntil('\n', drop=True)
    t2 = sh.recvuntil('\n', drop=True)
    a1 = decode(int(t1, 16))
    a2 = decode(int(t2, 16))
    return a1 + a2

总结:很多题目用z3去解决问题都能够快速的解决,这里简单的记录下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值