首先解压后得到三个文件,txt提示做题的系统要在WIN7以上,还有一个无后缀的主文件和一个msvcr120.dll,也就是vs2010编译的程序默认的库文件。这个.dll文件第一次见到是在某个游戏启动不了的时候,说缺少这个文件无法启动……
因为没法直接打开文件,所以拖到IDA里,然而弹出提示框。
这个链接的debug信息路径里出现了SMC的字眼,很像单词首字母那种,于是一搜索得知这是指Self-Modifying Code,即自修改代码。带着疑惑查看伪代码。
发现有点过于简单,而这个403020也并不是什么函数,单靠静态分析没有突破口。于是转战动态调试。
很容易的找到输入的地方
随意输入个字符串,紧接着是判断输入的长度是否为0x1c
继续走,来到一段奇怪的指令,这里对403020为始的一块区域进行了多次异或操作
然后这个[local.25]其实是指函数种的一个局部变量,在OD的设置里可以选择是否这样显示
然后当我们进入这个call eax的时候,发现403020这里已经是另外一番模样
再结合搜索的相关SMC知识,我们可以大概知道,403020这个地方就是一处经过加密修改的函数代码。而上方的xor循环异或就是简单加密/解密的算法。这也就是为什么静态分析的时候看不到这个函数,而在动态的过程中一步一步执行了解密的指令,因而看到了真实的样子。
同样的道理,这个题目里加了多层SMC,正如上图最下方的call edx,就是下一部分解密后的函数。最后总结下来整个逻辑过程。
确定flag的格式是
BUPT{}
{}里面的第一段字符串和0xcc异或后要得到0x93a9a498,逆之得到
The_
这一部分的代码很长,看起来有些费劲。于是选择在此处dump
但是这里一直出现问题,调试了很多遍,dump后的文件放到IDA里看的时候,403146到4032A0之间仍然是一些杂乱的数据,没有解密成完整的函数,因而也就无法顺利的反汇编。其他三部分SMC解密都是直接在push ebp这个地方dump即可得到完整函数的反汇编。猜测是修改跳转的时候没有把解密算法走完整?
关于dump涉及到PE结构等知识,还没有掌握这个操作。先mark一下。
反汇编未果于是在OD里走下一遍来,并且关注数据窗口的变化。
刚看过了BASE64,这一大坨就是base64用到的编码表,最后生成了一串字符串
解码可得
realCtF_
最后一部分是把
kvtu`C4h"o
各自减1得到
just_B3g!n
最后组合起来也就是
BUPT{The_realCtF_just_B3g!n}
是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据。计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。
更详细的一些了解可以参考这两个文章。
http://www.360doc.com/content/14/1201/12/11681374_429544253.shtml
https://blog.csdn.net/pandaos/article/details/46575441