首页
社区
课程
招聘
[原创]CTF2017 第三题 crackMe.exe writeup
2017-10-28 16:03 4686

[原创]CTF2017 第三题 crackMe.exe writeup

2017-10-28 16:03
4686
一堆反调试的题……没什么难的,以下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直播授课

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 260
活跃值: (39)
能力值: ( LV9,RANK:144 )
在线值:
发帖
回帖
粉丝
THREAD 2017-11-7 17:14
2
0
IDA  F5  出来的代码怎么简化的?
雪    币: 848
活跃值: (135)
能力值: ( LV13,RANK:430 )
在线值:
发帖
回帖
粉丝
hotwinter 6 2017-11-14 18:51
3
0
THREAD IDA F5 出来的代码怎么简化的?
y  改类型,n改命名,新建structure来构造结构体
游客
登录 | 注册 方可回帖
返回