如何调试没有可执行标志的二进制文件?

逆向工程 linux 数据库
2021-06-17 10:12:55

我正在尝试调试不可执行的二进制文件。

作为示例,我使用/bin/true644 权限:

install -m 644 /bin/true .

我正在尝试将其运行为:

$ lldb true
(lldb) target create "true"
Current executable set to 'true' (x86_64).
(lldb) process launch

但我有以下错误:

错误: 错误: ::posix_spawnp (pid => 29052, path = '/Foo/Bar/true', file_actions = 0x7fff5d015e98, attr = 0x7fff5d015ed8, argv = 0x7fd6396507f0, (pid => 29052, path = '/Foo/Bar/true', file_actions = 0x7fff5d015e98, argv = 0x7fd6396507f0) (x750rd007f0)x070rd00d00960000000000000

是否可以使用 lldb 而不给二进制文件提供可执行标志?

2个回答

lldb想要运行使用的组合的程序forkexec,则控制与编程' ptrace但是内核将拒绝exec该程序,除非它设置了正确的 x 位(您的用户/组 ID 定义了哪个是正确的)。您只能为自己(所有者)设置 x 位(如果您想阻止其他人执行二进制文件);或者您可以设置 x 位,启动进程,然后再次删除 x 位(如果您想防止自己意外运行它)。但是要启动运行二进制文件的进程,您需要 x 位。

如果你真的想执行二进制代码而不将其设置为可执行,你可能会编写一个程序来读取它的头,mmap你需要的部分,将二进制文件读入这些部分,可能修复重定位,然后跳转到入口点。但是要做到这一点,您将面临漫长而艰巨的过程,而且可能无法llvm识别二进制文件中的任何符号。因此,虽然这样做可能是理论上的可能性,但尝试确实没有意义。

至于解决方法(根据这篇文章),在 Linux 上,动态链接器/加载器可以调用不可执行的二进制文件,如下所示:

lldb -- /lib64/ld-linux-x86-64.so.2 foo_binary

而对于 32 位版本,请使用ld-linux.soin 中找到/lib