<-!-> Taller de Stack Overflows en Windows, por Rojodos

Iniciado por Rojodos, 16 Febrero 2005, 12:36 PM

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

Rojodos

Aclaracion:

Los offsets del jmp esp o del system.msvcrt.dll no tienen que ver con el compilador, sino con tu sistema. Por lo que me cuentas, al ser el mismo que el mio, tendras un Windows XP SP1 Español.

Al tener el mismo SO, con el mismo SP, y con el mismo lenguaje, tenemos las mismas librerias (salvo excepciones que no vienen al caso) y por tanto, los mismos offsets

1º:

Se perfectamente porque pasa eso :). El programa vulnerable yo lo compile con el Dev Cpp, que esta basado en el "motor" del GCC. El compilador, por temas de alineamiento, añade algunos bytes a cada variable a la hora de compilar, segun su tamaño. Existe por ahi una tabla (estoy seguro de haberla visto) que te calculaba exactamente los bytes de alineamiento que producia.

Obviamente, el compilador de VC++ es distinto, y no añade dichos bytes de alineamiento, con lo que el buffer es mas pequeño.



AGH XDDDDDDDDDDD

Los opcodes que pongo, son de una shellcode "mini", que solo hacen un system("cmd") en vez de system("cmd.exe"), vaya fallo :p xDDDDDDDDD

Es que al principio, pense en hacerla simple, pero luego me arrepenti, hize la "larga", pero no cambie los opcodes.

Los opcodes correctos son los que tu pones, pero ambos funcionan, asi que no lo voy a cambiar (ya he cambiado una vez el texto :P). Que fallo xDDDD Gracias por decirmelo :)

3º:

Ten en cuenta que el RET sobreescrito tiene que ser UNA DIRECCION, no una instruccion. Es decir, si pones una instruccion NOP (la instruccion NOP simplemente hace que el procesador no haga nada y salte a la siguiente instruccion), en opcode seria 0x90, el ret quedaria sobreescrito asi:

90909090

Pero, en vez de ejecutarse los 4 NOPs, lo que pasa es que EIP trata de ejecutar lo que haya en la direccion 90909090.

El ret sobreescrito tiene que ser SIEMPRE una DIRECCION.

Lo entiendes?

Me alegra que te guste el texto :)

Cualquier duda, ya sabes :)

Salu2

Griph

#11
El texto está bien. Sobre todo el método de didáctica que usaste, lo digo por explicar unas cuantas cosas con el debugger a mano, me parece que es una buena forma de fundamentar la teoría y práctica.

A pesar de que el texto está muy explicado, yo le recomendaría a cualquiera que
quiera comenzar con el tema de los exploits y las shellcodes que aprenda bien
ensamblador (fundamentalmente este lenguaje) y C; de otra forma a pesar de que
una persona con conocimientos nulos de programación ensamblador lea textos muy
explicados como éste, se le dificultará bastante la comprensión (hay que aprender a programar bien primero).

Para quien quiera saber más o menos de que se trata este texto, aquí le dejo un mini índice (me parece que te olvidaste de esa parte Rojodos, lo podrías agregar así organizas un poco mejor tu texto ;) :) ).

Citar
-== Introducción. ==-
- C/C++
- Ensamblador (ASM)
- Debugger (Depurador)
- Dissasembler (Desamblador)
- Hex Editor (Editor Hexadecimal)
- La CPU (microprocesador)
- Registros de la CPU.
- ¿Que es una vulnerabilidad?
- ¿Que es un exploit?
- ¿Que es una shellcode?
- ¿Que es un overflow?
- ¿Porque se le llama Stack Overflow?
-== EJEMPLO CODIGO VULNERABLE A STACK OVERFLOW ==-
-== ¿PARA QUE NOS SIRVE UN STACK OVERFLOW? ==-
-== COMO HACER UNA SHELLCODE BASICA ==-
-== CREANDO EL EXPLOIT ==-
-== DOCUMENTACION ==-
-== AGRADECIMIENTOS ==-

Saludos,

Griph.
"...la Base está en Aprender a Programar..."

PK2

Primero: entendí muy bien las explicaciones que me diste anteriormente Rojodos. Gracias. Pero siguo sin poder hacer funcionar el exploit. Para tratar de resolverlo estoy usando el OllyDbg y como argumento le estoy pasando la cadena evilbuffer de tu exploit. Le estoy pasando esto como argumento:

"AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLL
MMMMNNNNOOOOPPPPQQQQ\x0F\x98\xF8\x77\x55\x8B\xEC\x33
\xFF\x57\x83\xEC\x08\xC6\x45\xF8\x63\xC6\x45\xF9\x6D\xC6
\x45\xFA\x64\xC6\x45\xFB\x2E\xC6\x45\xFC\x65\xC6\x45\xFD
\x78\xC6\x45\xFE\x65\x8D\x45\xF8\x50\xBB\x44\x80\xBF\x77
\xFF\xD3"

Quería saber si esta manera de probarlo es correcta, ya que el programa llega a una instrucción en la que se clava, osea siguo apretando F7 si no avanza ni una intrucción, como que ejecutara la misma. Gracias.

byebye

fijate que valor tiene eip y sabras si esta sobreescrito o no.

PK2

Sigo sin poder hacer funcionar el exploit.

1ro. La shellcode funciona, cuando  ejecuto el código que solamente tiene que devolver una shell funciona.

2do. Me está costando encontrar el problema por que no logro seguirle el rastro al programa (debugearlo), no se si lo que hago es lo correcto. Lo que estoy haciendo es abrir el programa con el OllyDbg y pasarle como parámetro la cadena + el offset + el shellcode, pero me parece que esto está mal por que donde antes me aparecía 52525252 (a Rojodos le aparecia 54545454) a mi me aparece 4630785C (que en ascii es F0x\ - la primera parte del offset - que está alrevéz por el tema de LITTLE ENDIAN) que es donde debería estar la dirección a donde ir a buscar el JMP ESP (77F8980F).  Pienso que esto pasa por que estoy usando el OllyDbg ya que si se lo paso al argumento con el exploit, creo (creo) que si llega a la dir deseada (77F8980F) y ahí aparece otro problema (no se cual).

Quisiera saber si esto está mal.

Quisiera saber como puedo debugearlo correctamente.

Ayuda.

PK2

Más cosas.

Cuando hice la primera shellcode para ver si funcionaba, esta lo hace muy bien, la pase por el OllyDbg y llama sin problemas al offset del system (77BF8044); pero cuando el exploit tiene que ir hasta esa dirección (una ves ya cargada el resto de la shellcode) me dice que no encuntra la dirección (77BF8044),; esto logré hacerlo metiendo todos los opcodes a mano, los que no logro cargar todavía automáticamente.

Por que será?

Gracias.

??? ??? ??? ??? ???
Esto me está quemando la cabeza.

Rojodos

Vamos a ver, antes de nada, no le puedes meter al olly por argumentos "\xF0" por ejemplo, porque tomara \ por un lao, x por otro, F por otro y 0 por otro, es decir, tu quieres que \xF0 sea un byte no? Es que el olly te lo toma por 4 bytes \-x-F-0

Para eso deberias saber su conversion en ASCII (como \x41 = A), o hacerlo a traves de un programa que ejecute el programa vulnerable y le meta los opcodes por parametro, como el "exploit" en C que pongo al final, usando execv().

Tambien puedes crear un mini programita en C que te printee la shellcode por pantalla (su conversion a ascii claro), copiar+pegar en el olly el resultado. Asi tambien puede funcionar.

En cuanto al tema del offset, ten en cuenta, que la shellcode necesita que msvcrt.dll este cargada en el programa vulnerable. Si compilas el programa con Dev Cpp, como lo hize yo, la cargara automaticamente, pero no se si pasa eso al usar otro compilador, como VC++.

En ese caso, en el programa vulnerable tienes que añadir, detras de main(), esto:

LoadLibrary ("msvcrt.dll");

Si no te reconocoe LoadLibrary, mete el include "windows.h".

A ver si asi das con la tecla :)

Salu2

PK2

 :D
Listo. Funciona. El problema era que no cargaba la dll ntdll.

Gracias. :)

ynos

Tengo un problema, al intentar compilar el codigo vuln1.c con Dev-C++ me da muchos errores,  ???no le falta nada a ese codigo ??? porquee creo que declara a "funcion" pero nunca la invoca.

Si alguien me puede ayudar gracias
Salu2

Crack_X

Cita de: ynos en 22 Febrero 2005, 03:26 AM
Tengo un problema, al intentar compilar el codigo vuln1.c con Dev-C++ me da muchos errores,  ???no le falta nada a ese codigo ??? porquee creo que declara a "funcion" pero nunca la invoca.

Si alguien me puede ayudar gracias
Salu2

Ve al foro de programacion general y publica tus errores ahi te podemos ayudar.
Shit loads of money spend to show us wrong from right. Say no to war


Yasser Has Things To Say
WarZone