IDA:找出调用 sendmsg 的内容

逆向工程 艾达 linux
2021-07-07 14:05:48

我正在尝试反转服务器可执行文件(linux),我需要找到调用 sendmsg 的内容。通常我只能在 IDA 中使用外部参照,但在这种情况下它不会显示任何内容。但是,如果我在它上面设置断点,我可以看到它在我连接时被调用。所以我要问你的问题是:我怎样才能知道程序是如何到达 sendmsg 的?

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 ()