在osx

时间:2016-12-21 12:59:01

标签: c macos mono dynamic-linking mach-o

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

static MonoDomain *mono_root_domain = NULL;
   ...
MonoDomain* mono_get_root_domain (void)
{
        return mono_root_domain;
}

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

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

_mono_root_domain symbol

此符号指向0x2621A8的地址,该地址位于本地重定位部分(__DATA,__ bss):

local_relocation

这指向0x1A7690(__TEXT,__ sinmbol_stub)的地址: indirect stup

目标是 target

所以0x1A7DF8(__TEXT,__ stub_helper): enter image description here

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

1 个答案:

答案 0 :(得分:0)

出于安全原因并防止缓冲区溢出攻击和其他攻击,您无法知道,因为称为PIE或ASLR(地址空间布局随机化)的安全措施。但是,可以禁用此功能以进行调试。 LLDB和GDB做/可以调试可执行文件。使用CLI应用程序的方式如下:

  1. 从GitHub复制或下载此python脚本 https://github.com/thlorenz/chromium-build/blob/master/mac/change_mach_o_flags.py
  2. 例如,将python脚本保存在可执行文件旁边
  3. 如果是,请打开终端,然后cd打开您的可执行文件
  4. 输入chmod +x ./change_mach_o_flags.py以使脚本可执行
  5. 输入./change_mach_o_flags.py --no-pie ./YourExecutable
  6. 现在,您的可执行文件的地址不应再随机化了。因此,可以计算静态/全局变量的地址。为此,请在终端中执行以下操作(我假设您使用的是64位计算机):

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

    2. 查找您感兴趣的部分。查看addr字段。如果它包含让我们说0x0000000100001020,那么变量将被放置在ASLR禁用的位置。

    3. 我不确定这是否适用于dylib但您可以试试。现在我已经没时间了,但是我可以在家里试一试,看看这是否适用于dylibs。