CTF Reverse逆向学习之SMC动态代码加密技术
1461886022645831 发表于 四川 CTF 1448浏览 · 2024-07-23 10:44

SMC简介

SMC,即Self Modifying Code,动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代码进行解密,达到程序正常运行的效果。
SMC的实现方式有很多种,可以通过修改PE文件的Section Header、使用API Hook实现代码加密和解密、使用VMProtect等第三方加密工具等。

CTF中SMC

简要来说就是一段正常的代码,通过加密过程,使程序变得混乱,从而让IDA等反编译工具无法识别
(广义上可以理解为程序保护壳吧)
一般常见的为异或加密
同时一般伴随着SMC出现的还有
VirtualProtect
VirtualProtect 是 Windows 操作系统中的一个 API 函数,它允许应用程序改变一个内存页的保护属性。这个函数的原型如下:

BOOL VirtualProtect(
  LPCVOID lpAddress,  // 要改变保护属性的内存页的起始地址
  SIZE_T dwSize,      // 内存页的大小
  DWORD flNewProtect, // 新的保护属性
  PDWORD lpflOldProtect // 存储旧的保护属性
);

逆向分析中,VirtualProtect 函数通常用于代码自加密的场景。代码自加密是一种保护代码不被轻易逆向分析的技术,通过在程序运行时动态地修改代码的内存保护属性,使得代码在执行时可以被修改和执行,但在不执行时则不能被读取或修改

CTF 题目复现

[网鼎杯 2020 青龙组]jocker
这道题我觉得是很经典的SMC题型,题目下载在BUUCTF里面也有

打开函数可以看见程序的主要逻辑


大家可以看见这一步!
这就是程序的代码自加密
我们可以点进encrypt来看一下数据段


一大串不明所以的数据
那么程序经历这一步异或之后会是什么样子呢?
这段数据的ID就是encrypt,显而易见这就是我们的主要加密函数
下面我将介绍三种方法,让我们来正确看见主要函数:
这三步都要有一个重要前提:确保程序可以执行在这里!(重要)
如果有什么保护,和检查机制,记得想办法绕过,或者符合条件

1.通过IDA动调实现


现在我们已经知道了这一步是正在进行SMC
我们将断点设在解密之后
进行动调
这里要进入到解密程序
flag{fak3_alw35_sp_me!!}
需要大家根据前面的逻辑,得到假的flag
或者通过Keypatch修改程序到达SMC部分

现在进入程序看,可以发现数据不一样了
但是我们仍然无法正确F5正确看见伪代码
这个时候需要我们的IDA重编译功能
我们从这个数据段的开头 401500 一直选中到下面
401598
按u,回到字节文本状态
再在401500(段的开头),按p
重新编译

然后再F5就可以看见正确的函数了

IDApython

第二个方法:通过IDApython,人为的修改程序
跟上面一样,先锁定加密过程和加密地址


观察加密逻辑


简单的异或
shift+F2
打开IDApython

import idc
addr = 0x401500  # encrypt函数的地址
for i in range(187):
    b = get_bytes(addr + i, 1)
    idc.patch_byte(addr + i, ord(b) ^ 0x41)

这段代码可以理解为解密吧
我们的函数不是被加密了吗?
我们写个脚本解密就OK了!
然后再和上面的操作一样
在IDA里面重新编译一下即可


不在动调窗口,也是正确代码

通过OD dump

把文件拖入Ollydug中

点击plugins-中文搜索引擎-智能搜索


根据我们分析的逻辑
找到当前字符串

同时我们可以打开IDA,观察


因为IDA的汇编更清楚
我们找到SMC后
在这里,可以通过地址
然后在OD里面找到一样的位置
然后我们F2下断点
因为他会执行这个函数,所以我们断在下面的Call
然后单步F7步入


在这个界面点击plugins-od dump-第一个


脱壳
这样我们就可以得到一个exe文件!


IDA打开


这个也是正确的!
就是不能很好的动调

总结

SMC 是CTF re常见的一种题型,一般都搭配HOOK,tls等一起对代码进行保护,我们有三种方法可以得到源程序
1.通过IDA动调,程序始终要根据正确代码来运行,我们就在程序正确的时候,再分析
2.通过分析加密逻辑,来还原程序
3.通过Ollydug来dump下正确的逻辑

1 条评论
某人
表情
可输入 255