2016-08-29 3 views
0

Ich schrieb diesen Code für die Anruffunktion von dort Adresse:Anruffunktion von Adresse in Command

$ cat main.c 
#include <stdlib.h> 
#include <stdio.h> 

int test(){ 
     printf("%s\n","[*] i'm in test"); 
     return 1; 
} 

int main(int argc,char **argv){ 
     int (*m)(); 
     m=&test; 
     printf("[*] test func addr is: %p\n", m); 
     (*m)(); 
     return 0; 
} 
$ gcc -o main main.c 
$ ./main 
[*] test func addr is: 0x8048414 
[*] i'm in test 
$ 

kein Problem


aber ich Funktion will laufen und dort von argv in Kommandozeilen-Adresse übergeben ..

zum Beispiel, wenn die Adresse der Funktion test()0x222222 ist, möchte ich nach dem Programm mit diesem Befehlausführen, test() Funktion laufen ..

mein Code:

$ cat main.c 
#include <stdlib.h> 
#include <stdio.h> 

int test(){ 
     printf("%s\n","[*] i'm in test"); 
     return 1; 
} 

int main(int argc,char **argv){ 
     int (*m)(); 
     long conv ; 
     int num; 
     num=conv=strtol(argv[1],NULL,10); 
     printf("[*] argv[1] is: %d\n", num); 
     m=&test; 
     printf("[*] test func addr is: %p\n", m); 
     m=num; 
     (*m)(); 
     return 0; 
} 
$ gcc -o main main.c 
main.c: In function ‘main’: 
main.c:17:3: warning: assignment makes pointer from integer without a cast [enabled by default] 
$ ./main 8048444 
[*] argv[1] is: 8048444 
[*] test func addr is: 0x8048444 
Segmentation fault (core dumped) 
$ 

aber nicht laufen!

+6

Es ist '8048444' in Hex. Sie analysieren es als Dezimalzahl. Und sonst ist es ein schrecklicher Hack. –

Antwort

1

Speicheradressen in der Basis sind 16 stützen jedoch nicht mehr als 10 versuchen strtol(argv[1],NULL,10);-strtol(argv[1],NULL,16);

2

ändern, ist es wahr, dass statt 10 sollten Sie 16 verwenden, da Adressen immer in Hexadezimal-Format, aber Ihr Code sind immer noch gut laufen auch wenn das Argument 10 ist. Ihr Code produziert Segmentierungsfehler wegen dieser Zuordnung: m=num. Dies weist m anstelle der Adresse des Tests einen willkürlichen Wert zu und beim Aufrufen von (*m)() wird ein Segmentierungsfehler erzeugt, da m auf eine ungültige Position zeigt. Sie sollten die letzten zwei Zeilen wie folgt ändern:

Dies würde die Testfunktion ordnungsgemäß ausführen.