8


我正在尝试获取exit()libc 中提供的函数的地址(十六进制),但我不确定在哪里以及如何找到它。
任何人都知道找到它的方法,请分享一些想法。谢谢!

4

5 回答 5

9

如果您需要exit进程中已经存在的函数地址,请参阅 Grijesh 和其他人的回答。但是,如果您需要通过 nameexit解析 libc函数,例如因为 libc已被另一个库隐藏,您可以通过以下方式获取它:exitdlsym

#define _GNU_SOURCE     /* for RTLD_NEXT */
#include <dlfcn.h>
/* ... */
void (*exit_addr)(int) = dlsym(RTLD_NEXT, "exit");

dlsym解决,您需要链接-ldl.

于 2013-03-08T19:45:32.597 回答
6

我认为这会起作用:

printf("%p", (void*)exit);

IEEE Std 1003.1, 2004 版

"%p"参数应是指向 的指针void。指针的值以实现定义的方式转换为可打印字符序列。

于 2013-03-08T19:39:08.433 回答
5

任何函数的地址就是它的名字(没有括号)。你#include <stdlib.h>也需要。设置一个初始化的指针:

void (*p)(int) = exit;
于 2013-03-08T19:44:18.667 回答
3

您可以按如下方式使用 gdb:

gdb ./yourprogram
break main
run
print exit
$1 = {<text variable, no debug info>} 0xb7e4b7f0 <exit>
here is exit() address----------------^
于 2014-05-14T17:57:33.237 回答
1
printf("%p", exit);

您必须包含用于 printf 的 stdio.h 和用于退出的 stdlib.h。这将创建一个函数指针以退出并打印它。

于 2013-03-08T19:42:53.350 回答