加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

IOS逆向-恢复Dyld的内存加载办法

发布时间:2023-09-13 11:55:28 所属栏目:安全 来源:
导读:之前我们一直在使用由dyld及其NS Create Object File Image From Memory / NS Link Module API方法所提供的Mach-O捆绑包的内存加载方式。虽然这些方法我们今天仍然还在使用,但是这个工具较以往有一个很大的区别....

之前我们一直在使用由dyld及其NS Create Object File Image From Memory / NS Link Module API方法所提供的Mach-O捆绑包的内存加载方式。虽然这些方法我们今天仍然还在使用,但是这个工具较以往有一个很大的区别......现在很多模块都被持久化到了硬盘上。

作为一个红队队员,这对于我们的渗透工作并没有好处。毕竟,NSLinkModule一个非常有用的api函数,这个函数可以使得我们的有效载荷不被蓝队轻易的发现。

因此,在这篇文章中,我们来仔细看看dyld的变化,并看看我们能做些什么来恢复这一功能,让我们的工具在内存中多保存一段时间,防止被蓝队过早的发现。

NSLinkModule有何与众不同

由于dyld是开源的,我们可以深入研究一下经常使用的NSLinkModule方法的工作原理。

该函数的签名为:

NSModule APIs::NSLinkModule(NSObjectFileImage ofi, const char* moduleName, uint32_t options) { ... }

该函数的第一个参数是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);

}

...

}

通过分析可以发现,代码并不是真正的发生了 "新 "的变化。这段代码一直存在于dyld3中,只不过是现在macOS也决定使用这段代码路径。所以我们知道内存会被写入磁盘,并且路径会被传递给dlopen_from。

...

ofi->handle = dlopen_from(ofi->path, openMode, callerAddress);

...

因此,从本质上讲,这也就使得NSLinkModule成为了dlopen的一个封装器。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章