-
-
[原创]CTF2017 第三题 crackMe.exe writeup
-
2017-10-28 16:03
4686
-
[原创]CTF2017 第三题 crackMe.exe writeup
一堆反调试的题……没什么难的,以下IDA截屏中已将所有反调试去掉(Keypatch call 为 mov eax,0 即可绕过)
上来直接开IDA,字符串里面随便看一看,好像有很多调试器的名字……估计是检查findwindow之类的。是常用的反调试方法
跟踪过去看代码,一路x上去,就能到达我们的主要的DialogFunc了
f5 以后看帆以后的结果,由于sub_274990访问了 这个数组
推测和base64有关(刚开始以为是改版的base64,不过后来查源码以后得知其实是base64的编码表和解码表对接在了一起) 从代码结构也可以看出是标准的base64解码(忽略末尾等号 padding)
从原始代码可看出我们的输入会被进行两次base64解码以后扔进get_output这个函数
DialogFunc
暂且先忽略get_output,继续往下看
sub_277E70 看上去好像做了个hash的运算,init,do,finalize.
从init函数里面搜常数
得知这是国密3系列算法中的SM3, 继续往下看他会比较我们原始输入(刚开始看成base64解码后的输入)里面最后64个字符和SM3所算出来的值(SM3的输入是我们base64解码后的输入的前三个字符)是否相等
如果相等,他就会进行一个奇怪的运算……然后看输出是不是1
不难看出最容易让这个输出为一的情况就是我们的a2输入是空格打头……既我们需要刚才get_output那个函数里面给定我们base64解码后的输出,然后输出一个空格打头的字符串。下面看get_output (sub_275DE0) 这个函数的逻辑,不难看出……当我们的输入为//X (X可为任意字母) 时我们的输出就会以空格打头
整理以上所有内容,即可得到我们的输入是 b64encode(b64encode("//X")).rstrip("=") + SM3("//X").hexdigest()
这里可以看出本题有多解,同时因为我们程序的b64encode会忽略=,flag中不能含等号,我们只要把等号去掉就行了
至于SM3,我们可以找现成的库函数,我用的是这个
https://github.com/siddontang/pygmcrypto
python flag 生成代码
from base64 import b64encode
from gmcrypto.sm3 import SM3
def encode(s):
return b64encode(b64encode(s))
m = "///"
print encode(m).rstrip("=") + SM3(m).hexdigest()
最后因为多解拿到flag以后找管理员验证……
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课