Título: [Taller] Creando una shellcode (x86 | win) Publicado por: lShadowl en 26 Febrero 2011, 14:13 pm Creando una Shellcode por lShadowl Conocimientos previos requeridos: asm 32b y C Conocimientos previos: -Que es una shellcode? "Una shellcode es un conjunto de ?rdenes programadas generalmente en lenguaje ensamblador y trasladadas a opcodes que suelen ser inyectadas en la pila (o stack) de ejecuci?n de un programa para conseguir que la m?quina en la que reside se ejecute la operaci?n que se haya programado.(...)" >> http://es.wikipedia.org/wiki/Shellcode Herramientas usadas en este tutorial?Descarga: Todas las herramientas usadas en este tutorial pueden ser descargadas desde la plataforma Cygwin (http://www.cygwin.com/setup.exe) la cual es un emulador de sistemas Unix para Windows. La lista de las paquetes minimos ha descargar pasar seguir el tutorial es: -----Categoria Devel---- >binutils >gcc >nasm ----Categoria System---- >util-linux ----Categoria Editors---- >vim Otras herramientas y scripts usados estan como codigo fuente en el tutorial. Introduccion Este tutorial pretende exponer de una manera clara y bastante simple el procedimiento para codificar una shellcode basica. Podemos dividir el proceso en 2 partes: codificacion en ensamblador y conversion a opcode. El objetivo del tutorial es crear una shellcode que abra una cmd. Codificacion en ensamblador Para esta parte necesitaremos saber que funciones vamos a utilizar para cumplir el proposito (abrir la cmd). En nuestro caso necesitaremos el acceso a las funciones "WinExec" [con que ejecutaremos la cmd] y "ExitProcess" [con la cual saldremos del programa], ambas se encuentran en la dll "kernel32". Para utilizarlas al codificar necesitamos saber su offset, para esto usaremos a "arwin", un programa bastante sencillo que nos devuelve especificamente lo que buscamos, la direccion de la funcion. Aqui su codigo: Código
Es necesario saber la direccion de la funcion que utilizaremos ya que esta cambia a partir de las versiones del sistema operativo y se sus Service Packs. Ya con arwin usaremos la linea: $ arwin kernel32.dll WinExec con lo cual obtendremos un resultado parecido a este: (http://img18.imageshack.us/img18/3113/sctut1.jpg) El mismo proceso para buscar "ExitProcess". >> (http://img189.imageshack.us/img189/9650/sctut0.jpg) Ahora que tenemos las direcciones, pasemos al code en asm. -------------------------------------------------------------------------------------------- Código -------------------------------------------------------------------------------------------- Para cuestiones de seguimiento, llamaremos a este archivo "shc.asm". (Entremedio) Como pusiste a cmd en la pila, no veo ni un push? La respuesta a esta pregunta reside en el comportamiento de la instrucción 'call' en conjunto con la instrucción 'ret'>> CALL lo que hace es introducir IP+1 en la pila, ósea la instrucción que sigue al CALL, y salta a la dirección que se le indica, RET toma el valor que introduce el CALL en la pila, y salta a el. En ese caso Código y Código
son equivalente, así como son: Código
y Código
La conclusión que podemos sacar de este comportamiento es que call nos deja un puntero en la pila de la siguiente dirección, este es el principio del código. Salta a cmd: Código
En cmd: se manda el offset de "db 'cmd',00h" a pila y salta a init: Código
En init: 7C8623ADh pasa a edx y se lo llama teniendo el puntero a "db 'cmd',00h" en la pila. Código
Conversion a opcode Bien, ya que tenemos el codigo listo en shc.asm lo pasaremos ha codigo objeto. Para esto usaremos nasm asi: $ nasm -f bin -o shc.bin shc.asm En shc.bin tendremos algo como esto: Código: ???#?|????|???????cmd luego, usaremos la herramienta xxd para pasarlo a opcode, de esta forma: $ xxd -i shc.bin y nos devolvera esto: (http://img145.imageshack.us/img145/9991/sctut2.jpg) Y listo, tenemos nuestra shellcode lista en C: Código
Ahora, hay scripts que nos permiten tener otro tipo de salida del opcode, veamos este: Código
De esta forma:: $ xxd-shellcode.sh shc.bin Devolvera esto: (http://img134.imageshack.us/img134/3334/sctut3.jpg) y en shc.shellcode los opcodes Código
Ahora veamos la plantilla en C para probarla -------------------------- Código -------------------------- Asi que tendriamos en sch.c ...: Código
Compilamos ($ gcc -o shc shc.c) y probamos: (http://img171.imageshack.us/img171/3448/probg.jpg) Saludos! Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: Garfield07 en 26 Febrero 2011, 14:52 pm Me parece muy bien tu manual, deberías añadirlo a Post Interesantes.
Te lo subo a la Wiki por algún hueco, está todo muy bien explicado ;-) Aparte, bienvenido al foro, espero verte más por aquí... Un saludo! Sagrini PD: Un detallito, mejor que usar calls podrías usar los push. Te ahorras mucho espacio :¬¬ Código No la he probado, luego la miraré, pero ahora mismo la tuya va directa a la Wiki... Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: jackgris en 26 Febrero 2011, 23:00 pm Parece un exelente post, gracias, y no sabia que asi funcionaban los calls ;-) ;-)
Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: lShadowl en 27 Febrero 2011, 00:38 am Me parece muy bien tu manual, deberías añadirlo a Post Interesantes. Te lo subo a la Wiki por algún hueco, está todo muy bien explicado ;-) Aparte, bienvenido al foro, espero verte más por aquí... Un saludo! Sagrini PD: Un detallito, mejor que usar calls podrías usar los push. Te ahorras mucho espacio :¬¬ Código No la he probado, luego la miraré, pero ahora mismo la tuya va directa a la Wiki... Gracias por la calurosa bienvenida. Y pues si, son 5 bytes menos metiendole 'cmd' con push, vere como funciona asi. Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: Ivanchuk en 27 Febrero 2011, 00:58 am Muy buenos tutos Shadow ;-) y bienvenido al foro!
Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: master_death en 3 Abril 2011, 22:08 pm esta muy bueno el tuto muy bien explicado una pregunta las herramientas q utilizas las puedo conseguir aca che no las tengo seria bueno q colocaras los links de los programas q usaste.
Gracias por el tuto. "DE NADA SIRVEN LAS IDEAS SI NO LAS PONEMOS EN PRACTICA" Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: Иōҳ en 9 Abril 2011, 18:12 pm muy bueno eh... ahora solo una pregunta tu no eres el moderador de la zona en asm en el .com? D:
Título: Re: [Taller] Creando una shellcode (x86 | win) Publicado por: ShotgunLogic en 24 Abril 2011, 20:08 pm Una cosa que te pregunto, cuando dices que hacer un call en ese caso equivale a
inc eip push eip jmp func el incremento de eip no debería de ir ahi no? Es decir, segun tengo entendido cuando el procesador esta ejecutando una instrucción aprovecha el tiempo que derrocha en ir a memoria en incrementar el registro eip, vamos, que ya estaría apuntando a la siguiente instrucción, y hacer eso haría que apuntase a la siguiente de la siguiente. Vamos, yo lo tenía entendido asi xD |