首页
社区
课程
招聘
[原创]2020KCTF秋季赛第三题重返地球wp
2020-11-22 09:53 3528

[原创]2020KCTF秋季赛第三题重返地球wp

2020-11-22 09:53
3528

分析

  • 输入的flag用单向链表存储,长度限定为37
  • 以单向链表为基础实现了一个二维数组,用37x37的常量来初始化
  • 实现了一个自定义的虚拟机,或者叫有限状态自动机。vm里有自定义的指令集,指令也是用单向链表连接在一起。不同指令的内部数据结构也不同
  • 进入虚拟机前用setjmp3保存环境,虚拟机执行到类型为0xb的的机器码时调用longjmp退出虚拟机,返回到setjmp3的下一条指令处,具体用法和https://en.wikipedia.org/wiki/Setjmp.h里的example usage一致。
  • 有了上面的基础认识后,把虚拟机的指令结构分析出来,得到验证算法。
  • 验证过程其实是一个模29527的线性方程组,直接用sagemath求解即可。

解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
with open('log.txt','r') as fp:
    lines = fp.readlines()
 
res = []
 
for line in lines:
    if "add_node_0" in line:
        p_start = line.find('0x')
        p_end = line.find('u')
        n = int(line[p_start:p_end],16)
        res.append(n)
 
splits_lists = [res[37*i:37*(i+1)][::-1] for i in range(38)]
wanted= splits_lists[-1]
data = splits_lists[:-1][::-1]
 
A = Matrix(GF(29527),data)
y = vector(GF(29527),wanted)
A_ = A.inverse()
x = A_*y
 
res = ''.join([chr(n) for n in x])
print(res)

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-11-22 09:57 被afa9040e编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回