-
-
[原创]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编辑
,原因:
赞赏
他的文章
看原图