-
-
[原创]看雪TSRC_2017秋季赛第三题---------WriteUp
-
发表于:
2017-10-29 10:58
3875
-
[原创]看雪TSRC_2017秋季赛第三题---------WriteUp
拿到题没啥可说的,直接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, p
比0x20
先来可能就不行了。
所以还是先来看看transform_input
进行的什么样的计算,有没有机会让它给我们生成一个带有0x20
的值。
可以看出当输入的串为空格或/
时会有 0x20
的结果出现,所以找个在线base64计算一个全是/
的key来。
因为规则限制解只能是字母
和数字
,所以要找两次base64后不包含=
的值,我这里就用///////
来计算
两次base64的值为THk4dkx5OHZMdz09
, 没找到在线SM3的计算,所以就用OD调试,在SM3比较处下断点,用程序自己计算的值9aa4f168af9fcb372825d2e817379ab6ad4a7da973a38c44a0ec56a788dfb89b
补到后面,得到一个可用解。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)