2013-03-08 12 views
8


Sto cercando di ottenere l'indirizzo (in hex) della funzione exit() fornito in libc, ma non sono sicuro di dove e come trovarlo.
Qualcuno conosce il modo di trovarlo per favore condividi qualche idea. Grazie!in libc?

+0

Tutte le risposte sono buone, ma si dovrebbe capire che 'exit (3)' è una funzione di libreria standard invocando il '_exit (2)' syscall che è non proprio una funzione ma una chiamata di sistema (potresti invocarla con il codice assemblatore senza alcuna normale chiamata di funzione, anche se la funzione '_exit' di libc sta eseguendo il syscall come una funzione richiamabile da C) ... Il vero lavoro del sistema le chiamate sono fatte all'interno del kernel. –

risposta

9

Se è necessario l'indirizzo della funzione exit già presente nel vostro processo, vedere le risposte di Grijesh e altri. Ma se avete bisogno di risolvere la libc exit funzione di per nome, ad esempio a causa di libc exit è stato ombreggiato da un'altra libreria, è possibile ottenere con dlsym:

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

Per dlsym a risolvere, è necessario collegare con -ldl.

+2

Grazie per apprezzare la mia risposta e grazie per la tua buona risposta tecnica :) –

+0

Questo è stato davvero utile. Per aggiungere un po 'di informazioni che mi hanno bloccato per alcuni minuti, il comando per collegare con ldl sarebbe ad esempio 'gcc -o getptr getptr.c -ldl'. Il -ldl viene dopo la roba di gcc. – Rstevoa

6

penso che questo funzionerà:

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

IEEE Std 1003.1, 2004 Edition:

"%p" L'argomento deve essere un puntatore a void. Il valore del puntatore viene convertito in una sequenza di caratteri stampabili, in un modo definito dall'implementazione.

+1

+1, risposta elegante – slezica

1
printf("%p", exit); 

Si dovrà includere stdio.h per printf e stdlib.h per l'uscita. Questo crea un puntatore a funzione per uscire e stamparlo.

5

L'indirizzo di qualsiasi funzione è solo il suo nome (senza parentesi). Avrai anche bisogno di #include <stdlib.h>. Per impostare un puntatore initalised:

void (*p)(int) = exit; 
3

È possibile utilizzare gdb come segue:

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