【问题标题】:Handmade macOS executable手工制作的 macOS 可执行文件
【发布时间】:2021-08-29 23:11:45
【问题描述】:

我正在尝试为 macOS 实现一个微型编译器。 我在带有 M1 的 MacBook Pro 上运行 macOS 11.5assembly 编码工作正常,我对结果非常满意(当移交给 Clang 时编译并运行得很好)。

我的问题是我找不到自己生成有效可执行文件的方法。 我到了这样一个地步,radare2 可以正确反汇编可执行文件的每个部分, 但每次我尝试运行我的可执行文件时,我都会从终端获得 SIGKILL (9)。

我阅读了this whole file,因为我找不到任何其他关于 Mach-O 格式的文档来源。 剧透:效果不太好???

详细我的问题: Mach-O 标头很好。我的问题都是关于加载命令

我尝试注入以下段/命令:

  • __PAGEZERO
  • __TEXT
  • __TEXT,__text
  • __LINKEDIT
  • LC_DYLD_INFO
  • LC_LOAD_DYLINKER
  • LC_MAIN
  • LC_LOAD_DYLIB

但无论我尝试了什么(我什至尝试从其他可执行文件中复制它们的值,然后我“替换”了入口点的地址以匹配我的),我都找不到让我的可执行文件工作的方法.

有人知道我需要注入可执行文件的确切加载命令及其值吗?

PS:如果有办法不使用 dyld 我会更高兴(我打算坚持使用系统调用)

【问题讨论】:

  • 我在这里stackoverflow.com/questions/39863112/…的回答显然早于m1芯片仍然可能派上用场。
  • 您也可以尝试将 arm64/m1 的可执行文件大小填充为 16kb。
  • 即使在 __text 部分之前有 16kb 的填充,我仍然会收到 SIGKILL
  • 我的意思是整个可执行文件大小为 16 kb。您能否提供实际的 WIP 可执行文件?
  • 当然,there you go。 PS:傻瓜,不明白你在谈论整个文件的大小;-(

标签: macos assembly arm64 mach-o


【解决方案1】:

如果你使用 LC_UNIXTHREAD 而不是 LC_MAIN,你应该可以放弃 dyld。

但你被杀的至少一个原因是你没有代码签名。虽然 x86_64 代码可以在没有一个的情况下运行,但 arm64(e) 绝对必须有一个。 Apple 甚至修改了他们的链接器,为 arm64 添加了一个临时代码签名(您可以使用 -Wl,-no_adhoc_codesign 禁用它,但它不会运行)。
尝试在您制作的文件上运行codesign -s - path/to/binary,看看它是否可以工作。我不能确定这是你的二进制文件的唯一问题,但它肯定是一个。如果您也想自己生成这些代码签名,那么最直接的代码可能是libcodedirectory.c in ld64 source。苹果也有open sourced much more sophisticated codesigning code,还有像ldid这样的第三方实现。

【讨论】:

  • 我最终能够通过添加一个空的 __LINKEDIT 段来进行代码签名,但我仍然得到 SIGKILL ?。
  • 这个错误至少给了你一些可以使用的东西。有关mSuspicious 的实例,请参阅this file。这与内核中的检查并不完全相同,但它应该是一个很好的起点。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
相关资源
最近更新 更多