首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第三题WP
发表于: 2017-10-29 02:01 3051

[原创]看雪.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期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//