网安国赛-2020-ciscn-reverse-z3

8 篇文章 0 订阅
1 篇文章 0 订阅
z3

题目名即为z3,可猜测是用z3解方程

z3库的安装:借鉴简书中的一篇文章: z3安装与学习.
此文章中写到了win下的安装,没有准确提到linux下z3库安装的方法,自己尝试了一下做了一个小结:
1.前提:Python的版本是2.x
2.不能用pip install z3
3.采用源码安装
下载链接:源码下载
4.下载对应版本时查看自己的虚拟机是64位还是32位:

sudo uname –m

若是64位则显示x86_64。确认好之后下载对应的源码

在这里插入图片描述
5.之后按照上面那篇文章的步骤安装就ok了

那就开始做题吧。

文件拖入ida,找到main函数,F5查看代码
程序让我们输入flag,是长度为42的字符串。定义了一大堆变量,有43个方程。
再看下面的判断条件
在这里插入图片描述
*(&v7+i) == v91[i] 的时候flag是对的。
再看v91的值:在这里插入图片描述
v91
接下来就可以解方程了。
脚本:

from z3 import *
s = Solver()

v7 = 0x4F17
v8 = 0x9CF6
v9 = 0x8DDB
v10 = 0x8EA6
v11 = 0x6929
v12 = 0x9911
v13 = 0x40A2
v14 = 0x2F3E
v15 = 0x62B6
v16 = 0x4B82
v17 = 0x486C
v18 = 0x4002
v19 = 0x52D7
v20 = 0x2DEF
v21 = 0x28DC
v22 = 0x640D
v23 = 0x528F
v24 = 0x613B
v25 = 0x4781
v26 = 0x6B17
v27 = 0x3237
v28 = 0x2A93
v29 = 0x615F
v30 = 0x50BE
v31 = 0x598E
v32 = 0x4656
v33 = 0x5B31
v34 = 0x313A
v35 = 0x3010
v36 = 0x67FE
v37 = 0x4D5F
v38 = 0x58DB
v39 = 0x3799
v40 = 0x60A0
v41 = 0x2750
v42 = 0x3759
v43 = 0x8953
v44 = 0x7122
v45 = 0x81F9
v46 = 0x5524
v47 = 0x8971
v48 = 0x3A1D


v49 = Int('v49')
v50 = Int('v50')
v51 = Int('v51')
v52 = Int('v52')
v53 = Int('v53')
v54 = Int('v54')
v55 = Int('v55')
v56 = Int('v56')
v57 = Int('v57')
v58 = Int('v58')
v59 = Int('v59')
v60 = Int('v60')
v61 = Int('v61')
v62 = Int('v62')
v63 = Int('v63')
v64 = Int('v64')
v65 = Int('v65')
v66 = Int('v66')
v67 = Int('v67')
v68 = Int('v68')
v69 = Int('v69')
v70 = Int('v70')
v71 = Int('v71')
v72 = Int('v72')
v73 = Int('v73')
v74 = Int('v74')
v75 = Int('v75')
v76 = Int('v76')
v77 = Int('v77')
v78 = Int('v78')
v79 = Int('v79')
v80 = Int('v80')
v81 = Int('v81')
v82 = Int('v82')
v83 = Int('v83')
v84 = Int('v84')
v85 = Int('v85')
v86 = Int('v86')
v87 = Int('v87')
v88 = Int('v88')
v89 = Int('v89')
v90 = Int('v90')

v4 = Int('v4')

s.add(34 * v52 + 12 * v49 + 53 * v50 + 6 * v51 + 58 * v53 + 36 * v54 + v55 == 0x4F17)
s.add(27 * v53 + 73 * v52 + 12 * v51 + 83 * v49 + 85 * v50 + 96 * v54 + 52 * v55 == v8)
s.add(24 * v51 + 78 * v49 + 53 * v50 + 36 * v52 + 86 * v53 + 25 * v54 + 46 * v55 == v9)
s.add(78 * v50 + 39 * v49 + 52 * v51 + 9 * v52 + 62 * v53 + 37 * v54 + 84 * v55 == v10)
s.add(48 * v53 + 14 * v51 + 23 * v49 + 6 * v50 + 74 * v52 + 12 * v54 + 83 * v55 == v11)
s.add(15 * v54 + 48 * v53 + 92 * v51 + 85 * v50 + 27 * v49 + 42 * v52 + 72 * v55 == v12)
s.add(26 * v54 + 67 * v52 + 6 * v50 + 4 * v49 + 3 * v51 + 68 * v55 == v13)
s.add(34 * v59 + 12 * v56 + 53 * v57 + 6 * v58 + 58 * v60 + 36 * v61 + v62 == v14)
s.add(27 * v60 + 73 * v59 + 12 * v58 + 83 * v56 + 85 * v57 + 96 * v61 + 52 * v62 == v15)
s.add( 24 * v58 + 78 * v56 + 53 * v57 + 36 * v59 + 86 * v60 + 25 * v61 + 46 * v62 ==v16)
s.add(78 * v57 + 39 * v56 + 52 * v58 + 9 * v59 + 62 * v60 + 37 * v61 + 84 * v62 == v17)
s.add(48 * v60 + 14 * v58 + 23 * v56 + 6 * v57 + 74 * v59 + 12 * v61 + 83 * v62 == v18)
s.add(15 * v61 + 48 * v60 + 92 * v58 + 85 * v57 + 27 * v56 + 42 * v59 + 72 * v62 == v19)
s.add(26 * v61 + 67 * v59 + 6 * v57 + 4 * v56 + 3 * v58 + 68 * v62 == v20)
s.add(34 * v66 + 12 * v63 + 53 * v64 + 6 * v65 + 58 * v67 + 36 * v68 + v69 == v21)
s.add(27 * v67 + 73 * v66 + 12 * v65 + 83 * v63 + 85 * v64 + 96 * v68 + 52 * v69 == v22)
s.add(24 * v65 + 78 * v63 + 53 * v64 + 36 * v66 + 86 * v67 + 25 * v68 + 46 * v69 == v23)
s.add(78 * v64 + 39 * v63 + 52 * v65 + 9 * v66 + 62 * v67 + 37 * v68 + 84 * v69 == v24)
s.add( 48 * v67 + 14 * v65 + 23 * v63 + 6 * v64 + 74 * v66 + 12 * v68 + 83 * v69 == v25)
s.add(15 * v68 + 48 * v67 + 92 * v65 + 85 * v64 + 27 * v63 + 42 * v66 + 72 * v69 == v26)
s.add(26 * v68 + 67 * v66 + 6 * v64 + 4 * v63 + 3 * v65 + 68 * v69 == v27)
s.add(34 * v73 + 12 * v70 + 53 * v71 + 6 * v72 + 58 * v74 + 36 * v75 + v76 == v28)
s.add(27 * v74 + 73 * v73 + 12 * v72 + 83 * v70 + 85 * v71 + 96 * v75 + 52 * v76 == v29)
s.add(24 * v72 + 78 * v70 + 53 * v71 + 36 * v73 + 86 * v74 + 25 * v75 + 46 * v76 == v30)
s.add(78 * v71 + 39 * v70 + 52 * v72 + 9 * v73 + 62 * v74 + 37 * v75 + 84 * v76 == v31)
s.add(48 * v74 + 14 * v72 + 23 * v70 + 6 * v71 + 74 * v73 + 12 * v75 + 83 * v76 == v32)
s.add(15 * v75 + 48 * v74 + 92 * v72 + 85 * v71 + 27 * v70 + 42 * v73 + 72 * v76 == v33)
s.add(26 * v75 + 67 * v73 + 6 * v71 + 4 * v70 + 3 * v72 + 68 * v76 == v34)
s.add(34 * v80 + 12 * v77 + 53 * v78 + 6 * v79 + 58 * v81 + 36 * v82 + v83 == v35)
s.add(27 * v81 + 73 * v80 + 12 * v79 + 83 * v77 + 85 * v78 + 96 * v82 + 52 * v83== v36)
s.add(24 * v79 + 78 * v77 + 53 * v78 + 36 * v80 + 86 * v81 + 25 * v82 + 46 * v83 == v37)
s.add(78 * v78 + 39 * v77 + 52 * v79 + 9 * v80 + 62 * v81 + 37 * v82 + 84 * v83 == v38 )
s.add(48 * v81 + 14 * v79 + 23 * v77 + 6 * v78 + 74 * v80 + 12 * v82 + 83 * v83 == v39)
s.add(15 * v82 + 48 * v81 + 92 * v79 + 85 * v78 + 27 * v77 + 42 * v80 + 72 * v83 == v40)
s.add(26 * v82 + 67 * v80 + 6 * v78 + 4 * v77 + 3 * v79 + 68 * v83 == v41)
s.add(34 * v87 + 12 * v84 + 53 * v85 + 6 * v86 + 58 * v88 + 36 * v89 + v90 == v42)
s.add(27 * v88 + 73 * v87 + 12 * v86 + 83 * v84 + 85 * v85 + 96 * v89 + 52 * v90 ==v43)
s.add(24 * v86 + 78 * v84 + 53 * v85 + 36 * v87 + 86 * v88 + 25 * v89 + 46 * v90 == v44)
s.add(78 * v85 + 39 * v84 + 52 * v86 + 9 * v87 + 62 * v88 + 37 * v89 + 84 * v90 == v45)
s.add(48 * v88 + 14 * v86 + 23 * v84 + 6 * v85 + 74 * v87 + 12 * v89 + 83 * v90 == v46)
s.add(15 * v89 + 48 * v88 + 92 * v86 + 85 * v85 + 27 * v84 + 42 * v87 + 72 * v90v == v47)
s.add(v4 == 26 * v89 + 67 * v87 + 6 * v85 + 4 * v84 + 3 * v86)
s.add(v4 + 68 * v90 == v48)

if s.check() == sat:
   m = s.model()
   print m

v49 - v90 的解:

v = [102,108,97,103,123,55,101,49,55,49,100,52,51,45,54,51,98,57,45,52,101,49,56,45,57,57,48,101,45,54,101,49,52,99,50,97,102,101,54,52,56,125]

数字转字符:

import libnum
flag  = ''

v = [102,108,97,103,123,55,101,49,55,49,100,52,51,45,54,51,98,57,45,52,101,49,56,45,57,57,48,101,45,54,101,49,52,99,50,97,102,101,54,52,56,125]

for i in v:
   flag += libnum.n2s(i)[::-1]

print flag

得到 flag

这里写的定义vi的代码长的要命,后来又问了一下前辈,再瞅了一下z3的学习,发现了用for定义数组的方法,可以用
[Int(‘a%d’%i) for i in range(15)] 来定义一堆v,还没试,试完再更。

题一放出来,不到十分钟就有好几个大佬解出来了=-=实在是太牛皮了

新更

翻了翻其他大佬的博客,发现了求此题的简便的z3代码

from z3 import *



Sol = Solver()
# 初始化变量
v4=IntVector('v4', 42)   # 定义数组
v4=[20247,40182,36315,36518,26921,39185,16546
    ,12094,25270,19330,18540,16386,21207,11759
    ,10460,25613,21135,24891,18305,27415,12855
    ,10899,24927,20670,22926,18006,23345,12602
    ,12304,26622,19807,22747,14233,24736,10064
    ,14169,35155,28962,33273,21796,35185,14877]
input_str=IntVector("input_str",42)

Sol.add(v4[0] == 34 * input_str[3] + 12 * input_str[0] + 53 * input_str[1] + 6 * input_str[2] + 58 * input_str[4] + 36 * input_str[5] + input_str[6])
Sol.add(v4[1] == 27 * input_str[4] + 73 * input_str[3] + 12 * input_str[2] + 83 * input_str[0] + 85 * input_str[1] + 96 * input_str[5] + 52 * input_str[6])
Sol.add(v4[2] == 24 * input_str[2] + 78 * input_str[0] + 53 * input_str[1] + 36 * input_str[3] + 86 * input_str[4] + 25 * input_str[5] + 46 * input_str[6])
Sol.add(v4[3] == 78 * input_str[1] + 39 * input_str[0] + 52 * input_str[2] + 9 * input_str[3] + 62 * input_str[4] + 37 * input_str[5] + 84 * input_str[6])
Sol.add(v4[4] == 48 * input_str[4] + 14 * input_str[2] + 23 * input_str[0] + 6 * input_str[1] + 74 * input_str[3] + 12 * input_str[5] + 83 * input_str[6])
Sol.add(v4[5] == 15 * input_str[5] + 48 * input_str[4] + 92 * input_str[2] + 85 * input_str[1] + 27 * input_str[0] + 42 * input_str[3] + 72 * input_str[6])
Sol.add(v4[6] == 26 * input_str[5] + 67 * input_str[3] + 6 * input_str[1] + 4 * input_str[0] + 3 * input_str[2] + 68 * input_str[6])
Sol.add(v4[7] == 34 * input_str[10] + 12 * input_str[7] + 53 * input_str[8] + 6 * input_str[9] + 58 * input_str[11] + 36 * input_str[12] + input_str[13])
Sol.add(v4[8] == 27 * input_str[11] + 73 * input_str[10] + 12 * input_str[9] + 83 * input_str[7] + 85 * input_str[8] + 96 * input_str[12] + 52 * input_str[13])
Sol.add(v4[9] == 24 * input_str[9] + 78 * input_str[7] + 53 * input_str[8] + 36 * input_str[10] + 86 * input_str[11] + 25 * input_str[12] + 46 * input_str[13])
Sol.add(v4[10] == 78 * input_str[8] + 39 * input_str[7] + 52 * input_str[9] + 9 * input_str[10] + 62 * input_str[11] + 37 * input_str[12] + 84 * input_str[13])
Sol.add(v4[11] == 48 * input_str[11] + 14 * input_str[9] + 23 * input_str[7] + 6 * input_str[8] + 74 * input_str[10] + 12 * input_str[12] + 83 * input_str[13])
Sol.add(v4[12] == 15 * input_str[12] + 48 * input_str[11] + 92 * input_str[9] + 85 * input_str[8] + 27 * input_str[7] + 42 * input_str[10] + 72 * input_str[13])
Sol.add(v4[13] == 26 * input_str[12] + 67 * input_str[10] + 6 * input_str[8] + 4 * input_str[7] + 3 * input_str[9] + 68 * input_str[13])
Sol.add(v4[14] == 34 * input_str[17] + 12 * input_str[14] + 53 * input_str[15] + 6 * input_str[16] + 58 * input_str[18] + 36 * input_str[19] + input_str[20])
Sol.add(v4[15] == 27 * input_str[18] + 73 * input_str[17] + 12 * input_str[16] + 83 * input_str[14] + 85 * input_str[15] + 96 * input_str[19] + 52 * input_str[20])
Sol.add(v4[16] == 24 * input_str[16] + 78 * input_str[14] + 53 * input_str[15] + 36 * input_str[17] + 86 * input_str[18] + 25 * input_str[19] + 46 * input_str[20])
Sol.add(v4[17] == 78 * input_str[15] + 39 * input_str[14] + 52 * input_str[16] + 9 * input_str[17] + 62 * input_str[18] + 37 * input_str[19] + 84 * input_str[20])
Sol.add(v4[18] == 48 * input_str[18] + 14 * input_str[16] + 23 * input_str[14] + 6 * input_str[15] + 74 * input_str[17] + 12 * input_str[19] + 83 * input_str[20])
Sol.add(v4[19] == 15 * input_str[19] + 48 * input_str[18] + 92 * input_str[16] + 85 * input_str[15] + 27 * input_str[14] + 42 * input_str[17] + 72 * input_str[20])
Sol.add(v4[20] == 26 * input_str[19] + 67 * input_str[17] + 6 * input_str[15] + 4 * input_str[14] + 3 * input_str[16] + 68 * input_str[20])
Sol.add(v4[21] == 34 * input_str[24] + 12 * input_str[21] + 53 * input_str[22] + 6 * input_str[23] + 58 * input_str[25] + 36 * input_str[26] + input_str[27])
Sol.add(v4[22] == 27 * input_str[25] + 73 * input_str[24] + 12 * input_str[23] + 83 * input_str[21] + 85 * input_str[22] + 96 * input_str[26] + 52 * input_str[27])
Sol.add(v4[23] == 24 * input_str[23] + 78 * input_str[21] + 53 * input_str[22] + 36 * input_str[24] + 86 * input_str[25] + 25 * input_str[26] + 46 * input_str[27])
Sol.add(v4[24] == 78 * input_str[22] + 39 * input_str[21] + 52 * input_str[23] + 9 * input_str[24] + 62 * input_str[25] + 37 * input_str[26] + 84 * input_str[27])
Sol.add(v4[25] == 48 * input_str[25] + 14 * input_str[23] + 23 * input_str[21] + 6 * input_str[22] + 74 * input_str[24] + 12 * input_str[26] + 83 * input_str[27])
Sol.add(v4[26] == 15 * input_str[26] + 48 * input_str[25] + 92 * input_str[23] + 85 * input_str[22] + 27 * input_str[21] + 42 * input_str[24] + 72 * input_str[27])
Sol.add(v4[27] == 26 * input_str[26] + 67 * input_str[24] + 6 * input_str[22] + 4 * input_str[21] + 3 * input_str[23] + 68 * input_str[27])
Sol.add(v4[28] == 34 * input_str[31] + 12 * input_str[28] + 53 * input_str[29] + 6 * input_str[30] + 58 * input_str[32] + 36 * input_str[33] + input_str[34])
Sol.add(v4[29] == 27 * input_str[32] + 73 * input_str[31] + 12 * input_str[30] + 83 * input_str[28] + 85 * input_str[29] + 96 * input_str[33] + 52 * input_str[34])
Sol.add(v4[30] == 24 * input_str[30] + 78 * input_str[28] + 53 * input_str[29] + 36 * input_str[31] + 86 * input_str[32] + 25 * input_str[33] + 46 * input_str[34])
Sol.add(v4[31] == 78 * input_str[29] + 39 * input_str[28] + 52 * input_str[30] + 9 * input_str[31] + 62 * input_str[32] + 37 * input_str[33] + 84 * input_str[34])
Sol.add(v4[32] == 48 * input_str[32] + 14 * input_str[30] + 23 * input_str[28] + 6 * input_str[29] + 74 * input_str[31] + 12 * input_str[33] + 83 * input_str[34])
Sol.add(v4[33] == 15 * input_str[33] + 48 * input_str[32] + 92 * input_str[30] + 85 * input_str[29] + 27 * input_str[28] + 42 * input_str[31] + 72 * input_str[34])
Sol.add(v4[34] == 26 * input_str[33] + 67 * input_str[31] + 6 * input_str[29] + 4 * input_str[28] + 3 * input_str[30] + 68 * input_str[34])
Sol.add(v4[35] == 34 * input_str[38] + 12 * input_str[35] + 53 * input_str[36] + 6 * input_str[37] + 58 * input_str[39] + 36 * input_str[40] + input_str[41])
Sol.add(v4[36] == 27 * input_str[39] + 73 * input_str[38] + 12 * input_str[37] + 83 * input_str[35] + 85 * input_str[36] + 96 * input_str[40] + 52 * input_str[41])
Sol.add(v4[37] == 24 * input_str[37] + 78 * input_str[35] + 53 * input_str[36] + 36 * input_str[38] + 86 * input_str[39] + 25 * input_str[40] + 46 * input_str[41])
Sol.add(v4[38] == 78 * input_str[36] + 39 * input_str[35] + 52 * input_str[37] + 9 * input_str[38] + 62 * input_str[39] + 37 * input_str[40] + 84 * input_str[41])
Sol.add(v4[39] == 48 * input_str[39] + 14 * input_str[37] + 23 * input_str[35] + 6 * input_str[36] + 74 * input_str[38] + 12 * input_str[40] + 83 * input_str[41])
Sol.add(v4[40] == 15 * input_str[40] + 48 * input_str[39] + 92 * input_str[37] + 85 * input_str[36] + 27 * input_str[35] + 42 * input_str[38] + 72 * input_str[41])
Sol.add(v4[41] == 26 * input_str[40] + 67 * input_str[38] + 6 * input_str[36] + 4 * input_str[35] + 3 * input_str[37] + 68 * input_str[41])


# 求解
print(Sol.check())
print(Sol.model())

m = Sol.model()

print("answer:")
[print(chr(int(str(m[i]))),end='') for i in input_str]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值