首页
社区
课程
招聘
[原创]看雪TSRC_2017秋季赛第三题---------WriteUp
发表于: 2017-10-29 10:58 3900

[原创]看雪TSRC_2017秋季赛第三题---------WriteUp

2017-10-29 10:58
3900

拿到题没啥可说的,直接ida看流程,程序无花无壳,就一些反调试,不影响静态分析
主要流程如下:

首先接受用户输入,并且进行两次base64的解码计算,之后将解出来的串进行一个转换计算,
然后再对转换后的串计算SM3值,并用这个值与输入的后64位进行比较,通过进行最终校验。

根据流程已经知道了key的组成方式为: base64(base64(key))+SM3(transform_input(key))

先看看最终的check函数要验证什么样的数据,代码如下:

很明显的一个循环,循环条件是当传入的串的当前字节不是0x20时就进入循环进行计算,否则直接返回1
所以说只要transform_input函数计算出来一个0x20开头的串就可以直接成功。

此外当当前字节不是0x20且不为z, l, q, p时程序会一直向后读取,用12345678生成的解可行,
但是感觉这种比较靠运气,越界后的内存中如果z, l, q, p0x20先来可能就不行了。

所以还是先来看看transform_input进行的什么样的计算,有没有机会让它给我们生成一个带有0x20的值。

可以看出当输入的串为空格或/时会有 0x20的结果出现,所以找个在线base64计算一个全是/的key来。

因为规则限制解只能是字母数字,所以要找两次base64后不包含=的值,我这里就用///////来计算
两次base64的值为THk4dkx5OHZMdz09, 没找到在线SM3的计算,所以就用OD调试,在SM3比较处下断点,用程序自己计算的值9aa4f168af9fcb372825d2e817379ab6ad4a7da973a38c44a0ec56a788dfb89b
补到后面,得到一个可用解。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 4134
活跃值: (5847)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
实在是777
2018-7-3 19:13
0
游客
登录 | 注册 方可回帖
返回
//