我有一个从外部库(共享对象)导入函数的 linux 二进制文件。这些函数是延迟加载的,当 rip 位于@main
或时不可用@entry
。当我进入这样一个函数(如call sym.imp.<function>
)时,它进入 plt->got->linker->function。手动执行此操作(步入)非常耗时且不舒服。分析函数 ( aaa
) 似乎都没有注册afl ~ <function>
延迟加载库的任何函数 ( ),因此无法收集函数起始地址(直到链接器填充 plt/got)。
到目前为止,我想出的唯一方法是在 处中断call
,查找dm
(现在加载的)库的映射内存 ( ) 并添加函数的偏移量(通过预先直接/静态加载库收集)。这最终导致目标函数的起始地址。
即使这有效,我认为对于这样一个基本任务来说它仍然太复杂了,并且可能有一个更简单的方法。我记得 IDA/Windows 允许准备一个静态环境(加载二进制文件、库、添加注释、注释等),一旦进入调试器,初始化阶段(链接器)就会检测到准备好的库并要求使用/重载它们动态会话。在那里,您可以轻松地在函数上设置断点并且调试器成功停止。
问题是:如何在radare2 中不通过plt/got/linker 进入延迟加载的导入函数?
编辑:这是一个具体的例子:
r2 -d /usr/bin/rar
aaa
db sym.imp.__swprintf_chk
dc
然后你最终进入.plt
(两次)然后进入map.usr_lib_ld_2.27.so.r_x + 50055
.