[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

 

posted @ 2023-11-24 11:37  wakappxc  阅读(17)  评论(0编辑  收藏  举报  来源