【问题标题】:function address in libc?libc中的函数地址?
【发布时间】:2013-03-08 19:37:11
【问题描述】:


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

【问题讨论】:

  • 所有答案都很好,但你应该意识到exit(3) 是一个标准库函数,它调用_exit(2) 系统调用,它实际上不是一个函数,而是一个系统调用(你可以用汇编程序调用它没有任何普通函数调用的代码,即使来自 libc 的 _exit 函数将系统调用包装为可由 C 调用的函数)......系统调用的真正工作是在内核内部完成的。

标签: c linux libc


【解决方案1】:

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

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

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

【讨论】:

  • 感谢我的回答并感谢您的技术回答:)
  • 这真的很有帮助。要添加一些让我停留几分钟的信息,与 ldl 链接的命令例如是 gcc -o getptr getptr.c -ldl。 -ldl 出现在 gcc 之后。
【解决方案2】:

我认为这会起作用:

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

IEEE Std 1003.1, 2004 Edition

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

【讨论】:

    【解决方案3】:

    任何函数的地址就是它的名字(没有括号)。您还需要#include &lt;stdlib.h&gt;。设置初始化指针:

    void (*p)(int) = exit;
    

    【讨论】:

      【解决方案4】:

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

      gdb ./yourprogram
      break main
      run
      print exit
      $1 = {<text variable, no debug info>} 0xb7e4b7f0 <exit>
      here is exit() address----------------^
      

      【讨论】:

        【解决方案5】:
        printf("%p", exit);
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-24
          • 2013-09-22
          • 2012-06-27
          • 1970-01-01
          • 2015-04-18
          相关资源
          最近更新 更多