我有一个可以反汇编的带有 func 的二进制文件。我用任意参数调用它并观察其返回值和行为的简单方法是什么?
理想情况下,我想这样做:
- 在 gdb(或 gdb-peda)内
- 来自 C(即链接到可执行文件,就像它是一个 lib)
- 通过 Python 脚本(我记得读过有关 Python 脚本的文章,但找不到它)
我在 Linux 上运行,但这个问题也与其他操作系统有关。
我有一个可以反汇编的带有 func 的二进制文件。我用任意参数调用它并观察其返回值和行为的简单方法是什么?
理想情况下,我想这样做:
我在 Linux 上运行,但这个问题也与其他操作系统有关。
如果二进制文件是 PIE,通过 LIEF 二进制检测框架导出函数应该允许您调用您感兴趣的函数,就像它是共享对象中的函数一样。
如果二进制文件是动态链接的并且包含用于设置标准 C 运行时环境的代码,例如__libc_start_main调用main(),您可以使用 LD_PRELOAD 挂钩这些函数,并通过共享库注入插入您自己的代码,该共享库注入直接使用您选择的参数调用目标函数。
使用Qiling模拟器,可以记录程序的状态,然后在GDB中重放目标函数。由于正在模拟代码,因此可以直接操作进程状态的任何方面(寄存器、内存等)。
使用 Frida、Pin、DynamoRIO 等,你基本上可以让程序在运行时做你想做的事,在这种情况下,钩住一个函数,操纵它的参数并观察随后的行为。
e9patch 是一种静态二进制重写工具,允许在运行前更改/插入代码。
可能还有更多方法可以做到这一点,例如使用 ptrace 和 /proc 进行进程快照,然后使用 ptrace 操作寄存器和内存,使用 PANDA 进行仿真,使用 Unicorn 进行仿真,使用 QEMU 进行仿真,甚至可能是 ELF 寄生代码或插入调用的代码使用 LD_PRELOAD 和__attribute__ ((constructor)) injected_function(). 你有很多选择。