n1cef1sh's Blog

题解过程

首先解压后得到三个文件,txt提示做题的系统要在WIN7以上,还有一个无后缀的主文件和一个msvcr120.dll,也就是vs2010编译的程序默认的库文件。这个.dll文件第一次见到是在某个游戏启动不了的时候,说缺少这个文件无法启动……
因为没法直接打开文件,所以拖到IDA里,然而弹出提示框。 image 这个链接的debug信息路径里出现了SMC的字眼,很像单词首字母那种,于是一搜索得知这是指Self-Modifying Code,即自修改代码。带着疑惑查看伪代码。 image 发现有点过于简单,而这个403020也并不是什么函数,单靠静态分析没有突破口。于是转战动态调试。
很容易的找到输入的地方 image 随意输入个字符串,紧接着是判断输入的长度是否为0x1c image 继续走,来到一段奇怪的指令,这里对403020为始的一块区域进行了多次异或操作 image 然后这个[local.25]其实是指函数种的一个局部变量,在OD的设置里可以选择是否这样显示 image image image 然后当我们进入这个call eax的时候,发现403020这里已经是另外一番模样 image 再结合搜索的相关SMC知识,我们可以大概知道,403020这个地方就是一处经过加密修改的函数代码。而上方的xor循环异或就是简单加密/解密的算法。这也就是为什么静态分析的时候看不到这个函数,而在动态的过程中一步一步执行了解密的指令,因而看到了真实的样子。
同样的道理,这个题目里加了多层SMC,正如上图最下方的call edx,就是下一部分解密后的函数。最后总结下来整个逻辑过程。

第一部分

image 确定flag的格式是

BUPT{}

第二部分

image {}里面的第一段字符串和0xcc异或后要得到0x93a9a498,逆之得到

The_

第三部分

这一部分的代码很长,看起来有些费劲。于是选择在此处dump image 但是这里一直出现问题,调试了很多遍,dump后的文件放到IDA里看的时候,403146到4032A0之间仍然是一些杂乱的数据,没有解密成完整的函数,因而也就无法顺利的反汇编。其他三部分SMC解密都是直接在push ebp这个地方dump即可得到完整函数的反汇编。猜测是修改跳转的时候没有把解密算法走完整? image 关于dump涉及到PE结构等知识,还没有掌握这个操作。先mark一下。
反汇编未果于是在OD里走下一遍来,并且关注数据窗口的变化。 image 刚看过了BASE64,这一大坨就是base64用到的编码表,最后生成了一串字符串 image 解码可得

realCtF_

第四部分

image 最后一部分是把

kvtu`C4h"o

各自减1得到

just_B3g!n

最后组合起来也就是

BUPT{The_realCtF_just_B3g!n}

关于SMC

是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据。计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。
更详细的一些了解可以参考这两个文章。

http://www.360doc.com/content/14/1201/12/11681374_429544253.shtml
https://blog.csdn.net/pandaos/article/details/46575441