Scrivere shellcode: piccolo, senza null, autonomo
La shellcode è codice macchina grezzo iniettato ed eseguito. L'obiettivo tipico: execve("/bin/sh", NULL, NULL) via syscall.
; x86-64 execve /bin/sh
xor esi, esi
push rsi
mov rdi, 0x68732f2f6e69622f ; "/bin//sh"
push rdi
mov rdi, rsp
xor edx, edx
push 59
pop rax
syscallI vincoli
Niente null byte: se finisce in una stringa C, \x00 tronca. Si evitano con trucchi (xor per azzerare invece di mov 0).
Position-independent: nessun indirizzo assoluto. La stringa si mette sullo stack.
Piccola: deve stare nel buffer disponibile.
Difesa
NX rende lo stack non eseguibile: la shellcode classica non parte, e si passa a ROP. Seccomp limita le syscall. La shellcode resta rilevante dove una regione RWX esiste (JIT, alcuni driver).