Recibo el error de falla de segmentación cuando llamé a la función "target" en mi código de shell.
Aquí está el código C del programa:
#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;
}
Obtuve el código de operación de la instrucción "CALL TARGET_FUNCTION_ADDRESS" que es "0xfffef5e8" y lo guardé en un archivo como: echo -e "\ xe8 \ xf5 \ xfe \ xff" > shellcode
Luego pasé mi código de shell como entrada al programa como:
(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
Puedo ver que EIP está apuntando a mi shellcode dado pero aún no funciona como se esperaba.
¿Alguien puede decirme por qué mi código de shell no funciona?