之前我们一直在使用由dyld及其NS Create Object File Image From Memory / NS Link Module API方法所提供的逆内存Mach-O捆绑包的内存加载方式。虽然这些方法我们今天仍然还在使用 ,向恢但是复D方式这个工具较以往有一个很大的区别......现在很多模块都被持久化到了硬盘上。
@roguesys 在 2022 年 2 月发布公告称 ,加载dyld 的逆内存代码已经被更新,传递给 NSLinkModule 的向恢任何模块都将会被写入到一个临时的位置中。
作为一个红队队员,复D方式这对于我们的加载渗透工作并没有好处。毕竟,亿华云逆内存NSLinkModule一个非常有用的向恢api函数,这个函数可以使得我们的复D方式有效载荷不被蓝队轻易的发现 。
因此,加载在这篇文章中,逆内存我们来仔细看看dyld的向恢变化,并看看我们能做些什么来恢复这一功能 ,复D方式让我们的工具在内存中多保存一段时间,防止被蓝队过早的发现。
NSLinkModule有何与众不同
由于dyld是开源的香港云服务器,我们可以深入研究一下经常使用的NSLinkModule方法的工作原理。
该函数的签名为:
复制NSModule APIs::NSLinkModule(NSObjectFileImage ofi, const char* moduleName, uint32_t options) { ... }1.该函数的第一个参数是ofi ,它是用NSCreateObjectFileImageFromMemory创建的,它指向了存放Mach-O包的内存。然后我们还有moduleName参数和options参数,前者只是用于记录语句 ,源码下载后者一般是被忽略不用的。
通过查看代码发现 ,最新版本的NSLinkModule,会将osi所指向的内存写入磁盘。
复制if ( ofi->memSource != nullptr ) {...
char tempFileName[PATH_MAX];const char* tmpDir = this->libSystemHelpers->getenv("TMPDIR");if ( (tmpDir != nullptr) && (strlen(tmpDir) > 2) ) { strlcpy(tempFileName, tmpDir, PATH_MAX);if ( tmpDir[strlen(tmpDir) - 1] != / )strlcat(tempFileName, "/", PATH_MAX);}else
strlcpy(tempFileName, "/tmp/", PATH_MAX);strlcat(tempFileName, "NSCreateObjectFileImageFromMemory-XXXXXXXX", PATH_MAX);int fd = this->libSystemHelpers->mkstemp(tempFileName);if ( fd != -1 ) { ssize_t writtenSize = ::pwrite(fd, ofi->memSource, ofi->memLength, 0);}...
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.通过分析可以发现,代码并不是真正的发生了 "新 "的变化。这段代码一直存在于dyld3中 ,只不过是现在macOS也决定使用这段代码路径。高防服务器所以我们知道内存会被写入磁盘,并且路径会被传递给dlopen_from。
复制...
ofi->handle = dlopen_from(ofi->path, openMode, callerAddress);...1.2.3.因此 ,从本质上讲,这也就使得NSLinkModule成为了dlopen的一个封装器。
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)那我们能否恢复dyld之前的内存加载特性呢 ?
我们知道磁盘 I/O 是被用来持久化和读取我们的代码的......那么 ,如果我们在调用之前拦截它们 ,会发生什么呢?
使用dyld进行hook
为了拦截 I/O 调用 ,我们首先需要了解如何对dyld进行hook。
我们研究看看dyld是如何处理mmap调用的云计算