8


libcで提供されている関数のアドレス(16進数)を取得しようとしていますexit()が、どこでどのように見つけるかがわかりません。
誰でもそれを見つける方法を知っています。いくつかのアイデアを共有してください。ありがとうございました!

4

5 に答える 5

9

If you need the address of the exit function already present in your process, see answers by Grijesh and others. But if you need to resolve the libc exit function by name, for example because libc's exit has been shadowed by another library, you can obtain it with dlsym:

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

For dlsym to resolve, you'll need to link with -ldl.

于 2013-03-08T19:45:32.597 に答える
6

私はこれがうまくいくと思います:

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

IEEE Std 1003.1、2004 Edition

"%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 に答える