[Artículo] Introducción al shellcoding en GNU/Linux

Si has creado algún documento interesante, este es su sitio

Moderador: Moderadores

[Artículo] Introducción al shellcoding en GNU/Linux

Notapor TuXeD » Dom Dic 31, 2006 9:44 pm

Hola chicos ;)

Llevo un tiempo (mucho tiempo) pensando en crearme un blog, pero siempre lo he ido dejando... así que hoy por fin me he decidido y lo voy a hacer.

Para inaugurarlo, he decidido publicar un artículo sobre shellcoding en el primer post, que aparecerá a las 00:00 automágicamente. El artículo en sí es la unión de lo que se publicó en HxC #30 y lo que iba a publicarse en el #31 y obviamente nunca se publicó.

Como eso de hacer propaganda del blog no me gusta demasiado.. y menos dejandoos con la miel en los labios a los que lo leais antes de las 12, anticipo el artículo aquí: http://tuxed.serveblog.net/docs/shellcoding.pdf

Espero que os guste ;)
Feliz año nuevo a todos!

PD:Antes de las 12 en el blog aparecerá un 'not found'... :$
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Notapor SLaYeR » Dom Dic 31, 2006 11:49 pm

Gracias TuXeD!!! suerte con el blog! :D
ImagenImagen "Happy Hacking". Richard Stallman

Cuando la oscuridad nuble tu mente, que la paranoia sea tu guía.

Déjate caer por mi blog
SLaYeR
-<|:·þ
-<|:·þ
 
Mensajes: 2022
Registrado: Lun Sep 12, 2005 9:02 pm
Ubicación: Cuando crees que me ves cruzo la pared...

Notapor NeTTinG » Lun Ene 01, 2007 12:05 am

Gran idea compañero.

Yo estoy muy contento con el mio ;)

¡¡ Suerte !! ;)
| Blog NeTTinG | Proyecto Destripando iOS |
_____________________________
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas. (Albert Einstein)
Todos recaerán en la necesidad de conocer la única y presumible verdad que el gran embudo emana. (Sire Netting)
Avatar de Usuario
NeTTinG
Wadalbertita
Wadalbertita
 
Mensajes: 6270
Registrado: Mar Sep 20, 2005 5:54 pm
Ubicación: Bajo la trampilla del décimo primer piso.

Notapor Popolous » Lun Ene 01, 2007 6:46 pm

Mucha suerte con el blog, yo tengo el mío preparado desde hace ya, pero por pereza no lo he inaugurado oficialmente todavía. A ver si me pongo y lo saco.

¡Saludos!
A. Einstein, cabello y violín,
hacemos nuestra última reverencia;
aunque sólo comprendido por dos personas,
él mismo y, a veces, Dios.

Jack C. Rosseter

"Sin direccionamiento Físico, no hay direccionamiento Lógico"

Vikingo dixit
Popolous
Wadalbertita
Wadalbertita
 
Mensajes: 1946
Registrado: Mié Ene 26, 2005 10:40 pm
Ubicación: E=mc^2

Notapor NeTTinG » Lun Ene 01, 2007 9:08 pm

Uno que espera ansioso esa apertura ;)
| Blog NeTTinG | Proyecto Destripando iOS |
_____________________________
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas. (Albert Einstein)
Todos recaerán en la necesidad de conocer la única y presumible verdad que el gran embudo emana. (Sire Netting)
Avatar de Usuario
NeTTinG
Wadalbertita
Wadalbertita
 
Mensajes: 6270
Registrado: Mar Sep 20, 2005 5:54 pm
Ubicación: Bajo la trampilla del décimo primer piso.

Notapor aLeZX » Lun Ene 01, 2007 9:18 pm

Gracias TuXeD por el artículo!

El Blog me gusta, bastante sencillo :wink:

Saludos!!
Hay que tener en cuenta que el foro no son más que ceros y unos, nosotros NO. (aLeZX)
El Esperanto es la mejor solución de la idea de Lengua internacional. (Albert Einstein)
Si avanzo, seguidme; si me detengo, paradme; si retrocedo, matadme.
Es más fácil ser una hoja más del pajar que la aguja.


Uno más danzando en el mundo de los blogs: http://alezx.wordpress.com
aLeZX
<|:-)
<|:-)
 
Mensajes: 878
Registrado: Vie Ago 26, 2005 3:29 pm
Ubicación: Vía Láctea, creo.

Notapor NewLog » Jue Feb 15, 2007 12:07 pm

Sí señor!!! De las pocas (pocas) cosas que me imprimo! Además me lo estoy leyendo como si fuera una historia de lo más feliz!

Gracias por esto TuXeD! Es lo que llevaba buscando desde hace mucho tiempo! Ni smashing the stack for fun and profit ni *******, gracias gracias gracias! Al fin algo claro i conciso!

Espero no molestar mucho pero en breve voy a volver a postear con bastantes preguntas! Me encantaria poder entender todo lo que has escrito ya que tengo algunas dudas! Y eso que aun no me he leído la parte del BindPort Shellcode!

Todo lo que quiero junto!!! Asm, sockets y "exploits" todo en uno!

Gracias otra vez! Y dentro de poco vuelvo a postear!


Ahh por cierto, may the force be with ur blog :D
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Notapor NewLog » Mar Feb 20, 2007 1:17 pm

Voy a ir por pasos:

Mi primera duda es en el código:

Código: Seleccionar todo
ida:
call vuelta
db "cadena"


Mi pregunta es que una vez llamas a vuelta, la ejecución el programa no subiria hasta la función vuelta sin declarar la cadena? No tendria que ir primero db "cadena" y después call vuelta?

Listado 4

Código: Seleccionar todo
xor eax, eax
xor ebx, ebx
xor edx, edx


Por que los hacemos nulos si no los vamos a usar?

Código: Seleccionar todo
inc ebx


Por qué usas ebx y no uno de menor capacidad?


Ahora mis dudas estan en la parte en que explicas /bin/sh0XXXXYYYY

Código: Seleccionar todo
mov [edi+7], al


Esto en teoria te sirve para poner un nulo en la posición donde está el 0. Pero al no son 8 bits? No vas a sobreescribir donde estan las 'X' ?? No has de hacer una xor al, al para convertirla en nula??

Código: Seleccionar todo
mov [edi+12], eax


No son eax 32 bits?


Por último: Por que quieres sustituïr XXXX por /bin/sh ? Con eso tendriamos: /bin/sh(nulo)/bin/sh(nulos)


Siento mi estupidez, pero es que esto lo quiero entender del todo...

Muchas gracias por escribirlo, y muchas gracias por si contestas ^^
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Notapor TuXeD » Mar Feb 20, 2007 3:52 pm

A ver... la primera duda: El ensamblador genera un binario resultante que incluye los bytes de la cadena justo después de la instrucción call vuelta. Cuando tu hagas un call vuelta, lo que hace es almacenar la dirección siguiente (es decir, el principio de la cadena) en la pila y saltar a vuelta, con lo que en la pila tienes un puntero a esos bytes.

db "xxx" no es ninguna instrucción en ensamblador, sino una directiva del programa ensamblador (en este caso nasm) que sirve para indicar que queremos poner esos bytes en esa posición.

2.- Respecto a los xor... no los vamos a usar? Seguro? No tengo el artículo ahora mismo entre manos ni las shellcodes, pero yo diría que sí se usan. En eax almacenaremos luego el número de al syscall, y como éste será pequeño, primero lo hacemos nulo y luego ya meteremos el valor que toque en la parte baja, al; esto lo hacemos para evitar la aparición de nulos tras el ensamblado.

3.- Por qué uso ebx? Pues por que la syscall espera en ebx cierto parámetro, con lo que debo usar ebx, aunque me baste con uno más pequeño para poner el valor del parámetro.

4.- Si, al son 8 bits, y un caracter ocupa exactamente 8 bits... con lo que sustituyo el caracter '0' (0x30) por el caracter '\0' (0x00).

5.- Sí, eax son 32 bits. Por eso, como quiero un PUNTERO nulo necesito 32 bits a 0.

Queda más claro? Si no, cuando vuelva a la noche lo intentaré de nuevo que ahora tengo prisa.

Saludos
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Notapor NewLog » Jue Feb 22, 2007 12:12 pm

Gracias por contestar!

Ahora ya tengo clara la custión de los bits! Jejeje, no me cuadraban algunas cosas ^^

Lo que me queda por resolver es:

Por último: Por que quieres sustituïr XXXX por /bin/sh ? Con eso tendriamos: /bin/sh(nulo)/bin/sh(nulos)

Por què no ejecutamos /bin/sh a secas?

Lo que quiero decir es..por qué hacemos esto que dices:

Así pues, ahora ya tenemos todo
excepto la dirección de la cadena /bin/sh, que está alojada en edi y hay que ponerla en [edi+8],
sustituyendo a XXXX.


Por último.. y ya se que no debería ni preguntarlo aquí...
Yo compilo el archivo asm con: nasm archivo -o ejecutable
Cuando lo ejecuto con ./ejecutable como hago al ejecutarlo cuando compilo con gcc, me dice que no encuentra el comando (después de pedirme permisos!)

Siento mis rollos! De verdad, no te tomes prisa en contestar!
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Notapor TuXeD » Dom Feb 25, 2007 7:17 pm

Respecto a eso que comentas... ejecuto /bin/sh a secas, pero para ejecutar algo hay que usar la syscall execve y tiene el prototipo que menciona el artículo:

int execve(const char *filename, char *const argv [], char *const
envp[]);


El primer parámetro es simplemente un puntero al nombre del archivo a ejecutar, es decir a una cadena que contenga "/bin/sh" en este caso. El segundo es un array con los parámetros. Este array debe constar de una serie de punteros a cada uno de los parámetros (en nuestro caso solo 1 parámetro, el propio nombre de fichero) y luego un puntero NULL (es decir, 4 bytes nulos). El tercer parámetro podemos obviarlo y ponerlo a NULL directamente... es para las variables de entorno.

Así pues, supongamos que en 0xaabbccdd tenemos la cadena "/bin/sh\0" (\0 simboliza un byte nulo como final de cadena)... entonces necesitamos:

- eax == numero de syscall de execve
- ebx == 0xaabbccdd
- ecx == puntero a la estructura que contiene lo siguiente: 0xaabbccdd y luego 0x00000000.
- edx == 0x00000000.

Eso es precisamente lo que hace el código del listado 5 del artículo:

Código: Seleccionar todo
00> BITS 32
01> jmp short ida
02> vuelta:
03>pop ebx
04> xor eax, eax
05> mov [ebx+7], al
06> mov [ebx+12],eax
07> mov [ebx+8], ebx
08> lea ecx, [ebx+8]
09>  lea edx, [ebx+12]
10> mov al, 11
11> int 0x80
12> ida:
13> call vuelta
14> db "/bin/sh0XXXXYYYY"


La instrucción 03 obtiene la dirección donde empieza /bin/sh, luego con la 05 se mete un byte (al es de un byte) nulo (se ha puesto a 0 eax con un xor en 04). Seguidamente se meten esos 4 bytes nulos donde las YYYY y el puntero a /bin/sh donde las XXXX completando la estructura mencionada antes. Ahora solo queda copiar la dirección de dicha estructura en ecx, lo que se hace con la instrucción 08. Para edx también tenemos que copiar la instrucción de una estructura, pero en este caso solo contiene un byte nulo.

Espero haberme explicado :oops: .

Respecto a la otra duda, con esa instrucción realmente no generas un ejecutable, sino un archivo con el código máquina correspondiente. En realidad para poder ejecutarlo deberías crear un ejecutable ELF como se explica en la página 9 del artículo:

Código: Seleccionar todo
tuxed@athenea:~/Articulos HxC/shellcodes$ nasm -f elf hola_hxc.asm -o hola_hxc.o
tuxed@athenea:~/Articulos HxC/shellcodes$ ld hola_hxc.o -o hola_hxc


Así primero generas un fichero objeto ELF con nasm y luego creas el ejecutable con ld.
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm


Volver a Faq

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron