-
-
[原创]看雪.TSRC 2017CTF秋季赛第三题WP
-
发表于: 2017-10-29 02:01 3051
-
首先将程序拉入IDA,这已经成为我做CTF题目的习惯了。
查看入口,还算正常。应该也是vc写的,通常8.0以上版本的入口为call,jmp
的形式,但此题不是,是两个call
。随后在第二个call
中看到去main
函数的跳转函数,跳到434CA0
。
main
函数直接看伪代码:
DialogFunc
跳转去的伪代码如下(patch过的):
明显此处应该是主要流程所在了。
通过仔细分析,此处有4个算法,一是定制的base64解码算法,一是SM3 hash算法,一是替换算法,一是走迷宫算法。
此解法是与通常解法不同之处在于,取编码字符在base64常串中的位置偏移使用编码字符直接索引数组,数组如下:
这个数组使部分非base64字符也能解码。虽然对于索引进行了>=0x2b
的限制,但由于文中进行了两次base64解码,使第一次解码后末位字符为\x00
--\x2a
,就会产生基本一致的多解,如;
当然这种解码算法比较强悍,鲁棒性好。
算法过程请百度,这里只说解题怎么应对。
题目中将两次base64解码后输入的前3字节进行hash计算,然后比较hash结果与输入的后64字节。除此之外还有一个校验,为了简便计算,我们可以把64字节的比较输入始终附加在原有输入后面。
此算法是由两次base64解码后的字符,通过改写一个8byte的字串s
,然后与规则对照进行替换,替换规则如下:
当前输入为\x2f
时,则目标值为\x20
;若当前为\x20
时,则用规则进行替换;若为其它字符,则改写s
。一次替换后,s
还原默认状态。
这部分应该是一个10X10的深宫走法算法,深宫如下:
其中的0
为可行路径。题目中,替换后的输入字符为q z
分别表示向上一行和向下一行;p l
分别表示向左一格和向右一格。[3,8]
为死路。若输入为\x20
,则结束,返回True
;若走错,则返回False
,验证失败。
这里并没有对路径完成量进行约束,也产生了多解可能。这里,我们为简化,可以直接让替换后的第一个字符为\x20
。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)