Ricevo l'errore di errore di segmentazione quando ho chiamato la funzione "target" nel mio shellcode.
Ecco il codice C del programma:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#define AMOUNT_OF_STUFF 50
void target(){
//Magic Happens Here
}
void function_x(){
char * stuff = (char *)mmap(NULL, AMOUNT_OF_STUFF, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
if(stuff == MAP_FAILED){
exit(0);
}
printf("You can type %d bytes:\n", AMOUNT_OF_STUFF);
fflush(stdout);
int len = read(STDIN_FILENO, stuff, AMOUNT_OF_STUFF);
if(len == 0){
exit(0);
}
void (*func)() = (void (*)())stuff;
func();
}
int main(){
function_x();
return 0;
}
Ho ottenuto l'opcode dell'istruzione "CALL TARGET_FUNCTION_ADDRESS" che è "0xfffef5e8" e l'ho salvata in un file come: echo -e "\ xe8 \ xf5 \ xfe \ xff" > shellcode
Poi ho passato il mio shellcode come input al programma come:
(gdb) r < shellcode
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/rakesh/a.out < shellcode
You can type 50 bytes:
Breakpoint 1, 0x08048615 in function_x ()
(gdb) si
0xb7fd5000 in ?? ()
(gdb) x/10w $eip
0xb7fd5000: 0xfffef5e8 0x0000000a 0x00000000 0x00000000
0xb7fd5010: 0x00000000 0x00000000 0x00000000 0x00000000
0xb7fd5020: 0x00000000 0x00000000
(gdb) si
0xc2fd4efa in ?? ()
(gdb) si
Program received signal SIGSEGV, Segmentation fault.
0xc2fd4efa in ?? ()
(gdb)
[46]+ Stopped gdb ./a.out
Vedo che EIP sta puntando al mio shellcode dato ma ancora non funziona come previsto.
Qualcuno può dirmi perché il mio shellcode non funziona ??