TP3 - ¿Qué es un shellcode?

94 views
Skip to first unread message

Roberto Ulloa Rodríguez

unread,
Sep 22, 2009, 11:59:28 AM9/22/09
to Programación II (Grupo 01)
Para ir abriendo el diálogo, empiecen por responder esta pregunta:

¿Qué es un shellcode?

Roberto

PO. MUY IMPORTANTE: identifiquemos los correos iniciando el "asunto"
con

TP3 - Descripción general del asunto

Wilson Moreno

unread,
Sep 22, 2009, 2:37:19 PM9/22/09
to Programación II (Grupo 01)
Segun lo que estuve viendo, en resumidas cuentas es un codigo que se
ejecuta cuando la pila explota.

Roberto Ulloa

unread,
Sep 23, 2009, 8:23:08 AM9/23/09
to ci-12...@googlegroups.com
Mas preguntas:
¿Qué hace el código?
¿A que se refiere Wilson con decir que la pila explota?
¿Es único el shellcode?
¿Qué hace cada instrucción en ensamblador del shellcode?
¿Dónde se ubica ese shellcode?
¿Qué es un NOP?
¿Cómo es que se empieza a ejecutar el shellcode?




El 22 de septiembre de 2009 12:37, Wilson Moreno <yesid.c...@gmail.com> escribió:

Segun lo que estuve viendo, en resumidas cuentas es un codigo que se
ejecuta cuando la pila explota.



--

"Hágale el amor a la vida"
                            Evolución

David Villegas

unread,
Sep 24, 2009, 3:51:19 PM9/24/09
to ci-12...@googlegroups.com
Si, complementando lo que dijo Wilson, el shellcode es un conjunto de órdenes programadas que se ejecutan en la pila. Se llama así porque generalmente  inicia un intérprete de comandos, también conocido como terminal o consola, el cual es conocido es inglés como command shell, desde donde la persona puede controlar la máquina. Usualmente el código es generado en lenguaje ensamblador.

El código lo que hace es "inyectarse" en la pila o stack de ejecución de un programa, con el fin de lograr que la máquina en donde se encuentre instalado el programa se ejecute la operación que se haya programado.

Con decir que la pila explota lo que entendí es que el código (puede ser software, datos, o una secuencia de comandos) se aprovecha de un error o fallo que vuelve a los programas vulnerables (asumo que en este caso la pila del programa en ejecución), con el fin de causar un comportamiento no deseado o imprevisto en los programas.

Desde mi punto de vista el shellcode no es único, ya que existen diversos tipos. Está el shellcode local (shellcode usado para atacar una máquina específica), shellcode remoto (utilizado para atacar una máquina en una red local o la Internet), y de acuerdo a su ejecucución hay shellcodes ejecutables o shellcodes por etapas.

EL NOP (de No OPeration o No Operation Performed,) es una instrucción de lenguaje ensamblador, un protocolo de computadora o una secuencia de enunciados de lenguaje de programación, que no hace nada en absoluto. Su uso es para crackear software que chequea números seriales, requerimientos de software o hardware específico; permitir que se den direcciones de retorno no exactas;  así como para Padding (protección del encríptamiento). Su uso dentro del shellcode es alterar funciones y subrutinas para pasar "puestos" de chequeo, mediante la devolución del valor esperado a ser chequeado. Como la mayoría de instrucciones en el chequeo de rutina de seguridad no serán usadas, estas serán reemplazadas por NOP´s.

El shellcode se ejecuta por medio de las llamadas al sistema. El shellcode  se injectará el dentro del programa antes o al mismo tiempo que se explota la vulnerabilidad para obtener control del contador del programa. De esta forma se logra ajustar al contador al punto del shellcode, y después de esto se ejecuta el shellcode y realiza su tarea. La inyección de shellcode se realiza mediante el almacenamiento de datos enviados a través de la red por el porceso vulnerable, por un archivo que sea leído por el proceso vulnerable,  o por líneas de comando en el caso de ataques locales.

Roberto Ulloa

unread,
Sep 24, 2009, 4:14:18 PM9/24/09
to ci-12...@googlegroups.com
Y en sus palabras
¿para qué son los NOPs dentro del shellcode? ¿por qué nos sirven para hackear?
¿cómo es que se "inyecta" el código?
¿por qué el shellcode es generado en ensamblador?
¿shellcodes ejecutables o shellcodes por etapas?

Recuerden que los comentarios deben ser cortos. No más de 3 párrafo.

Eduardo

unread,
Sep 25, 2009, 2:09:59 AM9/25/09
to Programación II (Grupo 01)
Una shellcode es un grupo de instrucciones en lenguaje ensamblador,
las cuales son convertidas a opcodes (codigos de operacion) y son
inyectadas en la pila de ejecucion de un programa. Asi se puede
conseguir la ejecucion de una operacion, como abrir una cmd.

Estas shellcode son manejadas por programas llamados exploit
(aprovecha un fallo o alguna vulnerabilidad de otro programa). Estos
exploit actuan inyectando la shellcode en una cadena de caracteres del
programa que se desea atacar.

El programa vulnerado al ejecutarse puede llegar a realizar una copia
de la cadena donde se inyecto el codigo (en algun lugar de la
memoria). Esto podria causar desbordamiento de buffer o alguna otra
operacion que se haya programado en la shellcode.

Eduardo

unread,
Sep 25, 2009, 2:27:45 AM9/25/09
to Programación II (Grupo 01)
Estuve buscando un poco y me encontre que para ejecutar una shellcode
se "debe administrar un parametro de cadena, esto es “/bin/sh” a la
función syscall correspondiente".

Tambien decia que, para hacer esto es necesario saber en que parte de
la memoria se debe inyectar la shellcode que hagamos.

Entonces dice que se debe hacer un "call" al tope de la pila. Luego
haciendo pop en la pila se puede conseguir la siguiente direccion de
la pila y luego se puede hacer "ret" para lograr que el contador del
programa apunte a la direccion de memoria tras ese call. Entonces una
vez que tengamos la manera de apuntar a esa direccion, podremos
inyectar nuestra shellcode para acceder a las funciones que nos
permitan ejecutar nuestra shellcode(por ejemplo abrir una cmd con el
uso de funciones "WinExec").

Eduardo

unread,
Sep 25, 2009, 2:48:11 AM9/25/09
to Programación II (Grupo 01)
NOP(No operation), es una instruccion que le indica al procesador que
avance un ciclo sin hacer nada.

En una instruccion con un formato asi: caracteres + RET(direccion de
retorno)+ NOP + Shellcode

Un NOP seria como una instruccion de jump en lenguaje de maquina, asi
en un programa al ser ejecutado la direccion de retorno pasara a
apuntar a nuestro NOP, el cual a ejecutarse le indicara al procesador
que avance hasta el codigo que hayamos inyectado y cuando se ejecute
lograremos obtener el acceso y control de una funcion especifica,
segun el objetivo principal de nuestra shellcode....

David Villegas

unread,
Sep 25, 2009, 4:23:39 AM9/25/09
to ci-12...@googlegroups.com
Un NOP (no operación), es una instrucción que le indica al procesador que no haga nada, es decir, que no ejecute ninguna instrucción en absoluto durante un ciclo del reloj. La instrucción permite que la memoria de un programa sea reacomodada mientras el programa se ejecuta, lo cual nos sirve para hackear ya que permite cambiar registros, banderas, direcciones de retorno o memoria para que el programa al ejecutarse accese al código que se ha inyectado, y es a partir de ese momento que se obtiene manejo y control de los procesos y funciones.

Pienso que el código es generado en lenguaje ensamblador debido a que este es un lenguaje de bajo nivel, lo cual permite poco o ningún nivel de abstracción con respecto a la arquitectura del conjunto de instrucciones de la máquina específica, por lo que no hay diferencia entre el lenguaje y el lenguaje máquina, permitiendo la ejecución de código sin la necesidad de un compilador o intérprete para que corra. Además el lenguaje es más universal, ya que está confomado por unos y ceros en sus diferentes representaciones (decimal, binario, hexadecimal, octadecimal, etc), y como dentro de la memoria el formato de los registros es hexadecimal, permite que se de una representación simbólica de los distintos códigos de máquina de las arquitecturas de las computadoras, así como un control más preciso de las tareas realizadas por el procesador.

La inyección de código tengo entendido que se realiza aprovechando fallos o partes vulnerables en la máquina, y aparentemente la inyección se logra mediante la lectura de archivos, el almacenamiento de datos o por líneas de comando, pero como todavía no lo tengo muy claro seguiré buscando... Con respecto a lo de shellcodes, leí que hay un tipo de shellcode remoto que descarga y ejecuta archivos en el sistema. Este tipo de shellcode en lugar de ejecutar un shell, lo que hace es darle a las instrucciones a la máquina para que descargue archivos ejecutables de la red, los almacena en el disco y los ejecuta, con el fin de instalar software dañino en la computadora. También hay un shellcode por etapas, donde debido a que la cantidad de datos que se desean inyectar es muy limitada para ejecutar el shellcode directamente, el shellcode se puede ejecutar por etapas, donde primero se ejecuta una parte pequeña del shellcode, y luego este código descarga el resto del código en la memoria de procesamiento y lo ejecuta.

Roberto Ulloa

unread,
Sep 27, 2009, 5:41:19 AM9/27/09
to ci-12...@googlegroups.com
La inyección por etapas la podemos dejar para otro día. Limitémonos al caso más simple.
El shellcode más simple es justamente el que como bien anotaron abre un cmd o un /bin/sh
en linux.

Todavía no me queda claro si entendieron como es que se "inyecta" el shellcode y por qué
son super utiles las NOPs para el ataque si justamente le dicen al procesador que NO haga
nada (gaste un ciclo de reloj).

Mientras voy abriendo otro tema: qué esta mal con los printf?
Reply all
Reply to author
Forward
0 new messages