-
-
[原创]看雪.TSRC 2017CTF秋季赛第三题 crackMe
-
发表于: 2017-10-29 20:28 3420
-
对于这道题,服气。做的时候遇到思维定势,想着输入要符合base64解码和莫尔斯解码的规则,然而这题的关键就在与在解码时遇到不符合规则的情况就退出了,只解码符合规则的部分。
这题很精彩,但是出现了多解。先上代码
然后再给一组flag。
首先,整个校验的总流程如下
首先对输入进行两次base64
解码,然后再进行一次莫尔斯解码,对第二次base64
解码的结果的前3个字节计算SM3
哈希。哈希结果和输入的最后64个字节进行比较,比较通过后,再调用check
函数对莫尔斯解码的结果进行检查。这个检查很迷,基本没用。
如果逆向过base64
还是能意识到这是什么的。
这个函数比较长,只截取了关键的一段,其实这个解码没有多大用,只要知道/
是单词的间隔,也就是/
会被替换成空格
。
识别出这个主要是因为sm3_init
这个函数里面的初始值。
知道了算法之后就不用详细分析了。
这个题的一大亮点就是反调试,其实patch掉反调试之后,不用分析那么多也能搞出一个flag,就是三个0字节的SM3哈希183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de
。原理就是这个哈希值进行两次base64
解码后为空字符串,缓冲里面全是0,取前三个字节也是0,正好符合。可能这才是作者的意图?
下面来看一下这个程序是怎么反调试的。
首先加载模块,然后得到函数地址,判断一下函数地址处是否有软中断,最后调用isDebuggerPresent
。
这里涉及到PEB
结构和TEB
结构,详情请参考《加密与解密》第三版401页15.1.1 BeingDebugged。(请把广告费打到我账户上)。
不详述了,参考《加密与解密》第三版407页15.1.3 Heap Magic。
调试器的主窗口,也有标题和类名。使用这个API可以判断各种调试器的窗口是否打开。参考《加密与解密》第三版435页15.3.2 OllyDbg检测方法。
与查找窗口类似,查找进程。
通过句柄检测SoftICE和Filemon,参考《加密与解密》第三版433页15.3.1。
这里的反汇编出来的伪代码不太对,参考《加密与解密》第三版413页15.2.1。
参考《加密与解密》第三版415页。
参考《加密与解密》第三版423页。
参考《加密与解密》第三版436页。
参考《加密与解密》第三版440页15.3.5。
原理就是如果没有调试器,就利用int 3
设置四个硬件断点,这四个硬件断点都会inc eax
,最后eax的值就是4。如果调试器处理的int 3
,那么最后eax就是0。
以前没怎么逆向过Windows,一下搞了这么多反调试,太凶残。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!