问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

CTF Reverse逆向学习之SMC动态代码加密技术

创作时间:
作者:
@小白创作中心

CTF Reverse逆向学习之SMC动态代码加密技术

引用
CSDN
1.
https://m.blog.csdn.net/2302_82243198/article/details/145421536

SMC(Self-Modifying Code)是CTF竞赛中常见的逆向工程题目类型,通过修改代码或数据来防止静态分析。本文将详细介绍SMC的基本概念、实现方式,并通过一个具体的CTF题目来演示如何破解SMC保护。

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下正确的逻辑

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号