在osx上查找变量的虚拟内存地址

Goo*_*KSL 5 c macos mono mach-o dynamic-linking

考虑 mono/domain.c 中的以下代码:

static MonoDomain *mono_root_domain = NULL;
   ...
MonoDomain* mono_get_root_domain (void)
{
        return mono_root_domain;
}
Run Code Online (Sandbox Code Playgroud)

我的任务是在运行时从另一个进程读取 mono_root_domain 指针指向的结构数据。(从这个其他进程附加、读取、定位dylib等已经解决)

查看生成的 libmono dylib 我可以找到相应的符号:

_mono_root_domain 符号

该符号指向本地重定位段(__DATA,__bss)中0x2621A8的地址:

本地重定位

它指向0x1A7690的地址(__TEXT,__symbol_stub): 间接断点

目标是 目标

所以0x1A7DF8(__TEXT,__stub_helper): 在此输入图像描述

此时我完全不知道如何检索指向 MonoDomain 结构的实际指针。任何帮助表示赞赏。

jva*_*ela 3

出于安全原因并防止缓冲区溢出攻击和其他漏洞利用,您无法知道这一点,因为有一种称为 PIE 或 ASLR(地址空间布局随机化)的安全措施。但是,出于调试目的可以禁用此功能。LLDB 和 GDB 这样做是为了调试可执行文件。使用 CLI 应用程序完成此操作的方法如下:

  1. 从 GitHub https://github.com/thlorenz/chromium-build/blob/master/mac/change_mach_o_flags.py复制或下载此 python 脚本
  2. 例如,将 python 脚本保存在可执行文件旁边
  3. 如果是这样,请打开终端并cd转到可执行文件所在的位置
  4. 输入chmod +x ./change_mach_o_flags.py使脚本可执行
  5. 进入./change_mach_o_flags.py --no-pie ./YourExecutable

现在,您的可执行文件的地址不应再被随机化。因此,计算静态/全局变量的地址是可能的。为此,请在终端中执行以下操作(我假设您使用的是 64 位计算机):

  1. otool -v -l ./YourExecutable | open -f(这将生成一个文件文本,其中包含可执行文件中的命令,说明如何在内存中布局数据、文本等)

  2. 寻找您感兴趣的部分。查看该addr领域。如果它包含,0x0000000100001020那么变量将被准确地放置在那里,并且禁用 ASLR。

我不确定这是否适用于 dylibs,但你可以尝试一下。现在我没时间了,但我可以在家尝试一下,看看这是否可以用 dylibs 实现。