对于多阶段释放的样本,可以扔进 xdbg,在回连 C2 的函数下断。找到断下来的地址空间,不是 shellcode 的话就是一个完整的 PE,如果是 PE,直接 dump 出来,修复导入导出表后便能在 IDA 中分析。
看修复过程的操作主要涉及对 VirtualAddress 和 Relative VirtualAddress 的处理,顺便学习一下内存对齐的原理。
对于内存空间的任意值, 有:
VirtualAddress:进程虚拟内存的绝对地址。
RelativeAddress:从某个 ImageBase 开始的相对地址。
ImageBase+RVA=VirtualAddress。
对于 PE 文件从磁盘到内存映射:
由于 PE 文件在磁盘上和在内存中的对齐颗粒度不同,会导致同一个 PE 文件在磁盘上有两个不同的偏移。FOV:文件偏移,RVA 内存偏移。
PE 扩展头中定义了内存对齐颗粒度 SectionAlignment 和文件对齐颗粒度 FileAlignment。
相互转换的方法:差值 = RVA - 节 VirtualAddress (内存对齐值),FOV = 节 PointerToData 值 (文件偏移对齐值)。
对齐
经典的文件对齐值:200h,X86 内存对齐:1000h。
SectionAlignment 定义了内存中区块的对齐值,PE 文件被映射到内存中时,区块总是至少从一个页的边界开始。
对齐的原因
现代计算机中内存空间都是按照字节 (byte) 进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐,而不是说每个变量大小对齐。
对齐参数
即对齐的最小单位。假如对齐参数是 8 字节,那 4 字节的需要填充 4 字节 00h 到 8 字节,36 字节需要填充 4 字节的 00h 到 40 字节。