libcで提供されている関数のアドレス(16進数)を取得しようとしていますexit()
が、どこでどのように見つけるかがわかりません。
誰でもそれを見つける方法を知っています。いくつかのアイデアを共有してください。ありがとうございました!
5 に答える
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
.
私はこれがうまくいくと思います:
printf("%p", (void*)exit);
"%p"
引数はへのポインタでなければなりませんvoid
。ポインターの値は、実装定義の方法で、印刷可能な文字のシーケンスに変換されます。
関数のアドレスは、その名前だけです (括弧なし)。あなたも必要#include <stdlib.h>
になります。初期化されたポインタを設定するには:
void (*p)(int) = exit;
次のように gdb を使用できます。
gdb ./yourprogram
break main
run
print exit
$1 = {<text variable, no debug info>} 0xb7e4b7f0 <exit>
here is exit() address----------------^
printf("%p", exit);
printf には stdio.h を、終了には stdlib.h を含める必要があります。これにより、終了する関数ポインターが作成され、出力されます。