Post

[钩直饵咸] 记录一次Xor样本分析+仿写

[钩直饵咸] 记录一次Xor样本分析+仿写

样本hash: 65a9fed72a3bc6b32930290788d4f98b326743c7a19c106125aa8dbc0e341fc4


晚上水群,群里有大手子问有没有破解版支付宝,当然是有了,这不一会儿就有兄弟发出来了。借着这个样本,学习一下基础Xor加密免杀手法。

image.png

样本分析

image.png

放进die可以看到是一个字节小端序的控制台程序。新鲜的样本,二话不说先放到断网的虚拟机里跑一下。

image.png

可以看到卡巴斯基并没有报毒,说明没有显式加载的shellcode,使用cmd可以看到有错误提示,明显是没有成功加载shellcode,更像是一个loader,接下来我们尝试逆向分析。

image.png

没有任何的反调试,没有任何加壳,就是最原始的裸奔状态,降低了许多分析的难度。

image.png

放到pebear里看看,也没有导入特别的dll。搜索字符串看看能不能获得特别的作者信息。样本在本地机器上编译时,如果没有做特殊配置,默认是会把本地文件路径一起编译进去的,可以通过字符串发现,但是很可惜(并非可惜)这里没有发现有用的信息。

image.png

继续回到ida中分析,上面我们发现这个样本有使用很多puts函数,打印了许多运行日志,如果能还原这些日志,对我们分析肯定是事半功倍,我们可以借助ida强大的解析能力,使用alt+a快捷键,选择ctype就可以完美还原这些字符。

image.png

如此一来,这个程序就变得非常清晰,非常可观了。

image.png

这个程序核心的逻辑如下:

  • 申请一段内存空间。
  • 从文件a1.txt读取加密过的shellcode
  • 异或解密shellcode
  • 将解密后的shellcode加载到先前申请的内存空间中。
  • 将该内存空间转化成函数,达到执行shellcode的目的。

涉及到的WindowsApi有:

  • VirtualAlloc
  • VirtualFree

这也是一个最基础的xor加载的模板,关于xor加密,是使用最简单,实现最轻的,使其成为恶意软件的流行选择。它比 AESRC4 更快,并且不需要任何额外的库或使用 Windows API。此外,它是一种双向加密算法,允许将相同的函数用于加密和解密。

样本仿写

使用rust语言尽量仿写还原这个样本,挺有意思的。

image.png

一些基础的问题

Q. 为什么需要对shellcode进行加密?

这和杀毒软件的检测规则有关,大多数av会对程序进行静态扫描,如果程序内有与病毒库中特征码所契合的部分,就会认为这是一个恶意程序,相应的可以了解下YARA技术,就是通过特征码的匹配实现对恶意程序的甄别。对shellcode进行加密变形就可以有效的规避静态扫描。

YARA

恶意软件研究人员的瑞士军刀-yara - 🔰雨苁ℒ🔰

Q. 为什么我用了Xor加密还是不能够免杀?

Xor作为对称加密,使用同样的shellcode,同样的key生成的数据也是相同的,当这些特征都被提取贮存到特征库中,渐渐就会失去免杀效果,以下是一些其他措施帮助你强化你的Xor免杀:

  • 下面的代码执行了一个小的更改,并通过使 i 成为密钥的一部分来增加密钥的密钥空间。现在密钥空间大得多,暴力破解密钥就更困难了。
1
2
3
4
5
6
7
8
9
10
/*
	- pShellcode : Base address of the payload to encrypt 
	- sShellcodeSize : The size of the payload 
	- bKey : A single arbitrary byte representing the key for encrypting the payload
*/
VOID XorByiKeys(IN PBYTE pShellcode, IN SIZE_T sShellcodeSize, IN BYTE bKey) {
	for (size_t i = 0; i < sShellcodeSize; i++) {
		pShellcode[i] = pShellcode[i] ^ (bKey + i);
	}
}
  • 上面的代码片段仍然可以进一步强化。下面的代码片段使用密钥执行加密过程,重复使用密钥的每个字节,使其更难破解密钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
	- pShellcode : Base address of the payload to encrypt 
	- sShellcodeSize : The size of the payload 
	- bKey : A random array of bytes of specific size
	- sKeySize : The size of the key
*/
VOID XorByInputKey(IN PBYTE pShellcode, IN SIZE_T sShellcodeSize, IN PBYTE bKey, IN SIZE_T sKeySize) {
	for (size_t i = 0, j = 0; i < sShellcodeSize; i++, j++) {
		if (j > sKeySize){
			j = 0;
		}
		pShellcode[i] = pShellcode[i] ^ bKey[j];
	}
}

代码来自 maldevacademy.com

更多关于Xor免杀的细则: https://maldev.bamuwe.xyz/17.Payload Encryption - XOR/

This post is licensed under CC BY 4.0 by the author.