我正在尝试反转服务器可执行文件(linux),我需要找到调用 sendmsg 的内容。通常我只能在 IDA 中使用外部参照,但在这种情况下它不会显示任何内容。但是,如果我在它上面设置断点,我可以看到它在我连接时被调用。所以我要问你的问题是:我怎样才能知道程序是如何到达 sendmsg 的?
IDA:找出调用 sendmsg 的内容
逆向工程
艾达
linux
2021-07-07 14:05:48
2个回答
如果您在开始时中断,sendmsg您可以查看堆栈上的返回值以查看调用来自何处。只要没有创建堆栈帧,返回值就应该是 ESP 上方堆栈中的第一件事。取下图:

假设sendmsg是 where 所在Bar()的位置,返回地址将是被调用Foo()后的位置sendmsg。
我不确定您使用的是哪个调试器(可能是有用的信息),但在 GDB 中,您可以使用以下命令查看堆栈顶部(返回值):
(gdb) x/20xw $esp
这种技术在遵循面向对象的代码时很有用,并且很难获得外部参照。
回溯
或者按照 Guntram Blohm 的建议,您可以使用回溯。在 GDB 中:
(gdb) bt ; Prints entire backtrace
(gdb) bt n ; Prints 'n' innermost frames
(gdb) bt -n ; Prints 'n' outermost frames
在函数开始处断点并检查堆栈中的返回地址。或者例如在 C++ 中挂钩您的函数并记录 _ReturnAddress ()