[HGAME2023]math
观察程序可以把这个类型改为char
OK修改完毕
&savedregs其的地址是[rsp+180h]所以&savedregs-368为[rsp+10h]
也就是我们的v8
这时候我们的思路就是写脚本一个一个把我们的v8也就是所输入的flag一个一个算出来
采用python的Z3约束求解(顺便学习一下这个知识)
from z3 import * v11=[63998, 33111, 67762, 54789, 61979, 69619, 37190, 70162, 53110, 68678, 63339, 30687, 66494, 50936, 60810, 48784, 30188, 60104, 44599, 52265, 43048, 23660, 43850, 33646, 44270] v9=[126, 225, 62, 40, 216, 253, 20, 124, 232, 122, 62, 23, 100, 161, 36, 118, 21, 184, 26, 142, 59, 31, 186, 82, 79] #存入v9 和v11 a = [ Int(f'a[{i}]') for i in range(25)] #初始化25个Int类型的数据 s = Solver()#表示创建了一个新的求解器对象,用于处理线性方程组的求解 for i in range(5): for j in range(5): enc = 0 for k in range(5): enc += a[5*i+k] * v9[5*k+j] s.add(enc == v11[5*i+j])#将这些线性方程添加到Solver中。这表示求解器需要找到满足这些方程的整数解。 print(s.check()) #使用 s.check() 检查是否存在解,如果存在解,使用 s.model() 获取解的具体数值。 m=s.model() print(m) #将那25个值进行输出
输出以下值
a=25*[0] a[21] = 48 a[2] = 97 a[6] = 121 a[23] = 125 a[3] = 109 a[12] = 64 a[18] = 95 a[14] = 104 a[10] = 95 a[9] = 114 a[16] = 49 a[22] = 100 a[19] = 103 a[1] = 103 a[17] = 115 a[4] = 101 a[13] = 116 a[7] = 48 a[11] = 109 a[24] = 0 a[20] = 79 a[8] = 117 a[0] = 104 a[5] = 123 a[15] = 95 print(bytes(a))
得到flag