InflativeLoading可以执行一些UPX打包的EXE程序,包括calc.exe、PsExec。然而,只有一些加壳程序。
对于没有 的程序delayed import directory
,InflativeLoading 可以执行它们的 UPX 打包版本。然而,与未加壳的程序不同,加壳程序的所有 ILT 都是空的。
以普通的 calc.exe 为例,所有模块的 ILT 和 IAT 都是相同的。
但对于 UPX 打包的 calc.exe,导入目录中的所有条目的 ILT 都是空的。
但如果程序延迟了导入目录,比如 Mimikatz,它就会变得更加复杂。
对于正常的mimikatz.exe,延迟导入目录如下:
但是对于UPX加壳的mimikatz.exe,PE Bear无法解析
下面是 UPX 打包的 calc.exe 通过的测试用例。
将exe转换为shellcode是目标之一,这样可以更灵活地使用Mimikatz等一些安全工具。尽管像Donut这样的工具已经实现了这一点,仍然想用这样的方法创建这样一个工具,并希望它能带来一些改进。
InflativeLoading 受到一些经典和现代工具和技术的启发和启发,是一个可以动态地将本机 EXE 转换为 PIC shellcode 的工具。
简而言之,InflativeLoading 生成 shellcode 存根并将其添加到转储的 PE 主模块中。
该工具由两个组件组成:DumpPEFromMemory.exe
和InflativeLoading.py
。
从内存转储PE项目
DumpPEFromMemory.exe 用于获取所选 PE 文件的内存版本。它的工作原理是创建一个处于挂起状态的进程并将主模块转储到二进制文件中(在您的开发计算机上)。
为什么?典型的反射加载过程将 PE 文件的每个部分映射到新分配的内存区域。第一,虽然每个section的数据无论是在磁盘上还是在内存中都是基本一致的,但对于特殊的PE文件或者特定情况下,可能还是存在一定的差异。
// Code snippet from Maldev course
for (int i = 0; i < pPeHdrs->pImgNtHdrs->FileHeader.NumberOfSections; i++) {
memcpy(
(PVOID)(pPeBaseAddress + pPeHdrs->pImgSecHdr[i].VirtualAddress), // Distination: pPeBaseAddress + RVA
(PVOID)(pPeHdrs->pFileBuffer + pPeHdrs->pImgSecHdr[i].PointerToRawData), // Source: pPeHdrs->pFileBuffer + RVA
pPeHdrs->pImgSecHdr[i].SizeOfRawData // Size
);
}
其次,PE文件的内容已经存在于加载器的内存中(就像字节数组一样),但加载器仍然重新分配内存空间。DumpPEFromMemory 的执行是在操作员的开发机器上完成的,当 PE 文件加载到内存中时,操作员会得到 PE 文件的转储。尽管某些数据仍然需要更新,但无需在受害者机器上分配内存区域。
这样,我们就不需要手动映射文件,而只需要修补特定的数据区域,例如Import Directory
、Base Relocation Table Directory
、Delayed Load Import Descriptors Directory
等。
转储的主模块将保存为二进制文件以附加到 shellcode 存根中。
例如,DumpPEFromMemory 执行经典工具 mimikatz,并将其主模块转储到二进制文件中。
PS C:Users<...SNIP...>> .DumpPEFromMemory.exe .mimikatz.exe mimi.bin
[+] DONE
[+] Size Of The Image : 0x137000
Process PID: 12512
PEB Address:0000000000D41000
Image Base Address:00007FF69AA80000
Data successfully written to mimi.bin. Total bytes read: 0x137000
加载脚本
该脚本动态生成 shellcode 存根并将其添加到转储文件中。
shellcode完成以下任务:
-
遍历PEB并找到kernel32.dll
-
更新命令行
-
解析kernel32.dll,获取LoadLibraryA、GetProcAddress函数的地址。
-
找到带有偏移量的附加转储文件
-
动态修复导入目录、基重定位表目录、延迟加载导入描述符目录等。
-
将执行转移到PE文件的入口点。
例如,使用脚本读取之前转储的 mimikatz 并提供正确的命令行来转储 LSASS 中的凭据:
尽管 shellcode 存根通常应小于 1000 字节,但脚本仍将 shellcode 存根填充到4096 字节,以便与内存页边界对齐。然后操作员可以轻松地为不同的内存区域设置适当的页面权限。
下载地址
https://pan.quark.cn/s/d6412823213e
原文始发于微信公众号(TtTeam):Mimikatz 免杀 - EXE动态转换为PICshellcode
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论