Binnen de informatiebeveiliging is shellcode een klein programma of een relatief korte serie instructies die een aanvaller probeert uit te voeren op een computer die gekraakt wordt. De shellcode is onderdeel van een exploit, dus het geautomatiseerd kraken van een systeem op basis van bijvoorbeeld een programmeerfout. Naast de shellcode bestaat een exploit veelal ook uit een mechanisme om de shellcode op de computer die gekraakt wordt aan te brengen, wat injectie wordt genoemd. Regelmatig wordt shellcode ook egg genoemd.

Voorbeeld van een disassembler

De naam shellcode is afkomstig van het feit, dat veelal door hackers gepoogd wordt een shell te krijgen op een machine waarmee men interactief controle hierover krijgt. Op Windowssystemen zijn de DOS box (command.com) of Windows shell (cmd.exe) voorbeelden van shells. Op unix- en linuxsystemen zijn sh, csh en bash hier voorbeelden van. Het begrip shellcode is echter algemener, en ook als bijvoorbeeld zonder dat er een shell wordt gebruikt informatie van een systeem gestolen kan worden met een dergelijk klein programma, wordt dit shellcode genoemd.

Er bestaan twee types shellcode, local shellcode en remote shellcode. Bij lokale shellcode heeft een hacker al beperkte toegang tot een systeem, en kan hij door middel van de shellcode zorgen dat hij meer privileges krijgt, of zelfs het hele systeem overnemen. Bij remote shellcode heeft de hacker nog geen toegang tot de computer die hij wil kraken, en injecteert hij shellcode via een netwerk zoals het internet.

Shellcode kan door een ervaren hacker zelf worden geschreven, of het kan door bijvoorbeeld een script kiddie door software zoals Metasploit worden gegenereerd of eenvoudig van het internet worden gedownload. Het type programmeerfout dat de uitvoering van shellcode doorgaans mogelijk maakt, is de bufferoverloop (Engels: buffer overflow).

De meeste shellcode wordt in machinetaal geschreven, de laagste programmeertaal die dan ook het dichtst bij de processor zit. Specialistische kennis over de instructieset van een specifieke processor, bijvoorbeeld de x86 processor, is nodig voor het ontwikkelen van shellcode. De instructieset geeft aan, welke commando's door de processor kunnen worden begrepen en uitgevoerd. Een programmeertaal die iets hoger is dan machinetaal is assembleertaal. De binaire instructies van machinetaal, ook wel opcodes genoemd, en die vaak hexadecimaal worden weergegeven, kunnen door een disassembler worden vertaald in assembleertaal. In plaats van de hexadecimale getallen van de machinetaal worden instructies daarin bijvoorbeeld weergegeven als 'xor', 'push' en 'mov', wat voor de meeste mensen leesbaarder is.

De detectie van shellcode kan handmatig of geautomatiseerd plaatsvinden. Handmatige detectie vergt ervaring en kan tijdrovend zijn. Voor de x86 instructieset op Windowsmachines kan een debugger als OllyDbg hierbij helpen. Op Unix- en Linuxsystemen kan een debugger zoals gdb bij de handmatige detectie inzicht geven in wat de shellcode doet. Een voorbeeld van software die de automatische detectie van shellcode verzorgt, bijvoorbeeld voor het gebruik in honeypots, is libemu.

Van bestaande shellcode worden databases bijgehouden, zoals het shellcode-archief dat onderdeel vormt van het Metasploit Project. Er is shellcode die zichzelf wijzigt, wat detectie veel moeilijker maakt. Deze zogenaamde polymorfische shellcode kan met programma's zoals admutate worden vervaardigd. Verder is een deel van de shellcode vaak versleuteld, doorgaans met XOR-encryptie.

Indien bij shellcode gebruikgemaakt wordt van een NOP sled, een reeks NOPs, instructies waarbij de processor in feite geen operatie hoeft uit te voeren, is dit doorgaans eenvoudig te detecteren door bijvoorbeeld een intrusion detection system. Veelal weten hackers het gebruik van dit soort NOP sleds te voorkomen.