Skip to content
shellcodes

¿Qué es el shellcode? Una guía completa

Shellcode explicado: qué es, por qué lo usan los exploits, cómo se escribe y codifica, y cómo generarlo y probarlo de forma segura en tu navegador.

Publicado el 4 min de lectura

El shellcode es un fragmento pequeño de código máquina independiente de posición que se ejecuta como payload de un exploit. Cuando un fallo te da el control del puntero de instrucción, el shellcode es lo que se ejecuta a continuación. Esta guía cubre qué es, los tipos habituales, las restricciones que lo rompen y cómo generarlo y analizarlo de forma segura.

¿Qué es el shellcode?

El shellcode son instrucciones de CPU en crudo, no un programa que ejecutas desde una shell. No tiene cargador, ni cabeceras, ni enlazador: solo bytes que el procesador ejecuta directamente en cuanto tu exploit le redirige el control. Como cae en una dirección que no conoces de antemano, tiene que ser independiente de posición: sin direcciones absolutas codificadas, todo relativo.

¿Por qué se llama "shellcode"?

Los payloads originales hacían una sola cosa: lanzar una shell de comandos (/bin/sh en Unix, cmd.exe en Windows), dando al atacante control interactivo. El nombre sobrevivió al significado estrecho. Hoy "shellcode" se refiere a cualquier payload pequeño en código máquina, ya abra una shell, llame a casa o cargue una etapa mayor.

Cómo funciona el shellcode

Un flujo típico:

  1. Una vulnerabilidad (desbordamiento de pila, use-after-free, format string) te permite sobrescribir un valor de control.
  2. Rediriges la ejecución a un buffer que controlas.
  3. La CPU empieza a ejecutar tus bytes como instrucciones.
  4. El shellcode prepara los registros e invoca una llamada al sistema para hacer su trabajo.

En Linux ese paso final suele ser una instrucción syscall/int 0x80; en Windows resuelve y llama a funciones de la API. En cualquier caso el código debe ser autónomo y sobrevivir a las protecciones de memoria que haya en juego.

Tipos de shellcode

  • Exec / local — ejecuta un comando en el sitio. Pequeño y silencioso. Útil cuando ya tienes un canal.
  • Reverse TCP — se conecta de vuelta a tu listener para una sesión interactiva.
  • Bind — abre un puerto en el objetivo y espera.
  • Por etapas vs sin etapas — un stager pequeño descarga un payload mayor, frente a enviarlo todo de una vez.

Cuál usar depende de la primitiva y del entorno, no de cuál parece más vistoso. Mira Linux exec vs reverse TCP para el compromiso.

Qué aspecto tiene el shellcode

Un execve("/bin/sh") de 25 bytes en Linux x86:

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

Esos bytes ponen a cero un registro, apilan /bin//sh, preparan los argumentos de execve y disparan la syscall. Para más, con el desensamblado al lado, mira ejemplos de shellcode.

Bad chars y null bytes

La entrega suele pasar tus bytes por funciones de cadena. Un solo 0x00 puede truncar copias tipo strcpy y partir tu payload por la mitad; saltos de línea, espacios y barras rompen otros parsers. Por eso los payloads se codifican para evitar valores de byte concretos. Es también de donde vienen la mayoría de los fallos del tipo "funcionaba en el depurador, no en el objetivo" — mira null bytes en el shellcode.

Cómo se genera el shellcode

Tres caminos habituales: ensamblador escrito a mano, un framework como msfvenom, o un generador que ensambla y codifica por ti. Se diferencian en control, portabilidad y cuánta confianza depositas en los bytes de otro. La comparación completa está en cómo generar shellcode. Puedes construir y codificar payloads enteramente en el cliente con el builder de Shellcodes sin instalar ningún framework.

Cómo analizar el shellcode

Antes de ejecutar bytes —sobre todo bytes que no escribiste tú— decodifícalos y desensámblalos. Convertir un blob con escapes \x de vuelta a mnemónicos te dice qué hace realmente y saca a la luz los bad chars. El conversor de Shellcodes desensambla con Capstone; el flujo está en decodificar y desensamblar shellcode.

El shellcode es de doble uso. Escribirlo, generarlo y probarlo es legítimo en pruebas de penetración autorizadas, CTFs, investigación de exploits e ingeniería de detección — e ilegal contra sistemas que no posees o para los que no tienes permiso de prueba. Mantenlo en laboratorios y en encargos con alcance definido. Mira la política de uso responsable.

Preguntas frecuentes

¿Es el shellcode un virus? No. Es una técnica de payload. Solo se vuelve malicioso cuando se combina con un exploit contra un objetivo que no estás autorizado a probar.

¿En qué lenguaje se escribe el shellcode? En ensamblador, que luego se ensambla a bytes de código máquina en crudo. Es habitual prototipar la lógica en C para encontrar las syscalls correctas.

¿Cómo ejecuto shellcode de forma segura? En una VM o contenedor de laboratorio aislado que controles, después de decodificarlo y desensamblarlo para saber exactamente qué hace.

Artículos relacionados

Convierte bytes de shellcode en crudo de vuelta a ensamblador — decodifica formatos hex y con escapes, desensambla con Capstone y detecta bad chars antes de ejecutar.
Ejemplos de shellcode comentados para Linux x86 y x64 —execve /bin/sh y reverse TCP— con los bytes, el desensamblado y las trampas.
Cómo funciona el shellcode en Linux —syscalls, registros y código independiente de posición— y cómo ensamblarlo, codificarlo y probarlo de forma segura.