BUUCTF [ACTF新生赛2020]Universe_final_answer(Z3求解器)

文件无壳 拖入ida

shift+F12查看可疑字符串

进入主函数 F5查看伪c代码

这段伪C代码是一个简单的程序,其主要目的是接收用户输入的一个字符串(作为"key")

这段代码的主要目的是通过一系列检查和处理来验证用户输入的密钥,并基于验证结果输出一个标志(flag)或错误信息。

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  __int64 v4; // [rsp+0h] [rbp-A8h] BYREF
  char v5[104]; // [rsp+20h] [rbp-88h] BYREF
  unsigned __int64 v6; // [rsp+88h] [rbp-20h]

  v6 = __readfsqword(0x28u);
  __printf_chk(1LL, "Please give me the key string:", a3);
  scanf("%s", v5);
  if ( (unsigned __int8)sub_860(v5) )
  {
    sub_C50(v5, &v4);
    __printf_chk(1LL, "Judgement pass! flag is actf{%s_%s}\n", v5);
  }
  else
  {
    puts("False key!");
  }
  return 0LL;
}

跟进sub_860函数 看到很多方程式 看到这种就知道应该要用Z3求解器解题

编写反脚本

from z3 import *

# 创建一个求解器
s = Solver()

# 定义变量
v1, v2, v3, v4, v5, v6, v7, v8, v9, v11 = Reals('v1 v2 v3 v4 v5 v6 v7 v8 v9 v11')

# 添加方程
s.add(-85 * v9 + 58 * v8 + 97 * v6 + v7 - 45 * v5 + 84 * v4 + 95 * v2 - 20 * v1 + 12 * v3 == 12613)
s.add(30 * v11 - 70 * v9 - 122 * v6 - 81 * v7 - 66 * v5 - 115 * v4 - 41 * v3 - 86 * v1 - 15 * v2 - 30 * v8 == -54400)
s.add(-103 * v11 + 120 * v8 + 108 * v7 + 48 * v4 - 89 * v3 + 78 * v1 - 41 * v2 + 31 * v5 - 64 * v6 - 120 * v9 == -10283)
s.add(71 * v6 + 128 * v7 + 99 * v5 - 111 * v3 + 85 * v1 + 79 * v2 - 30 * v4 - 119 * v8 + 48 * v9 - 16 * v11 == 22855)
s.add(5 * v11 + 23 * v9 + 122 * v8 - 19 * v6 + 99 * v7 - 117 * v5 - 69 * v3 + 22 * v1 - 98 * v2 + 10 * v4 == -2944)
s.add(-54 * v11 - 23 * v8 - 82 * v3 - 85 * v2 + 124 * v1 - 11 * v4 - 8 * v5 - 60 * v7 + 95 * v6 + 100 * v9 == -2222)
s.add(-83 * v11 - 111 * v7 - 57 * v2 + 41 * v1 + 73 * v3 - 18 * v4 + 26 * v5 + 16 * v6 + 77 * v8 - 63 * v9 == -13258)
s.add(81 * v11 - 48 * v9 + 66 * v8 - 104 * v6 - 121 * v7 + 95 * v5 + 85 * v4 + 60 * v3 - 85 * v2 + 80 * v1 == -1559)
s.add(101 * v11 - 85 * v9 + 7 * v6 + 117 * v7 - 83 * v5 - 101 * v4 + 90 * v3 - 28 * v1 + 18 * v2 - v8 == 6308)
s.add(99 * v11 - 28 * v9 + 5 * v8 + 93 * v6 - 18 * v7 - 127 * v5 + 6 * v4 - 9 * v3 - 93 * v1 + 58 * v2 == -1697)

# 检查是否有解
if s.check() == sat:
    # 如果有解,则获取并打印模型
    result = s.model()
    print(result)
else:
    print("No solution found.")

按顺序输出 得到F0uRTy_7w@

V1和V2,V6和V7都交换了位置,所以最后也要相应调整。

flag{F0uRTy_7w@_42}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值