Shellcode es una secuencia de código de máquina, o instrucciones ejecutables, que se inyecta en la memoria de una computadora con la intención de tomar el control de un programa en ejecución. En tal ataque, uno de los pasos es obtener el control del contador del programa, que identifica la siguiente instrucción a ejecutar. A continuación, el flujo del programa se puede redirigir al código insertado. El código de máquina intrusivo se denomina carga útil del ataque y es el elemento al que comúnmente se hace referencia con el término shellcode. Este método se ha utilizado a menudo para otorgar acceso a un atacante abriendo un shell de comandos del sistema operativo, por lo que los ataques de inyección de código en general se conocen como shellcode.
La vulnerabilidad que se explota generalmente implica cómo un programa asigna memoria, verifica la validez de los datos de entrada y maneja los errores de memoria. Los desarrolladores de software generalmente pueden evitar esta amenaza definiendo estrictamente los datos de entrada y rechazando los valores incorrectos. Si no se marca, se pueden aceptar los valores que necesitan más espacio de almacenamiento que la memoria asignada para ese valor. Esto provoca una brecha de seguridad llamada desbordamiento del búfer, donde parte de los datos se escriben en ubicaciones de memoria adyacentes al espacio asignado al valor. Cuando se manipula con cuidado, esta anomalía puede permitir la introducción de código intrusivo.
Shellcode normalmente se escribe en un lenguaje de programación con acceso al sistema de bajo nivel, como ensamblador, C o C ++. Sin embargo, dependiendo de la vulnerabilidad de destino, se puede obtener el mismo resultado insertando código para un lenguaje de scripting interpretado, como PERL, o código de bytes para una máquina virtual, como JAVA. El código se puede implantar antes, durante o después del secuestro del contador del programa. Por lo tanto, el código intrusivo puede estar contenido en un archivo en la máquina de destino o transmitirse a través de una conexión de red en tiempo real.
Los exploits de shellcode locales están diseñados para otorgar a un atacante control sobre una máquina a la que tiene acceso físico. Un objetivo en este caso podría ser crear una cuenta con privilegios de administrador, por ejemplo. De manera similar, si un proceso en ejecución tiene un alto nivel de privilegios, un exploit exitoso otorgaría temporalmente el mismo nivel de acceso al intruso.
Los procesos que se ejecutan en una máquina remota pueden explotarse utilizando protocolos de red estándar para comunicarse con la computadora de destino. El shellcode de conexión le indica a la máquina de destino que inicie una conexión con la computadora del intruso. Si el intruso inicia la conexión, el código se llama bindshell, ya que intenta tomar el control de una conexión de red llamada puerto en la máquina remota. El método de conexión se usa más ampliamente, ya que los firewalls rara vez prohíben las conexiones salientes.