Pilha (Stack Frames)
Stack — Anatomia, Exploração e Defesa (x86/x64)
Objetivo: tornar o aluno capaz de visualizar, instrumentar e manipular a stack em qualquer cenário de engenharia reversa ou exploit development.
1 Conceito e Função
Pilha (Stack) = estrutura LIFO mantida pela CPU/SO para gerenciar chamadas de função.
Cria frames (blocos) contendo endereço de retorno, registradores salvos, variáveis locais e às vezes argumentos.
2 Layout de um Stack Frame (System V AMD64)

Stack Frame (Pilha) nada mais é do que partes da memória separadas pra cada função, com seus argumentos e variáveis.
↑ Endereços altos
┌─────────────┐ ← RBP (Base Pointer)
│ Parâmetros │ (se passados na stack)
├─────────────┤
│ Retorno → │ endereço para o chamador
├─────────────┤
│ RBP antigo │ cadeado da stack
├─────────────┤
│ Locais │ variáveis + canário (se -fstack-protector)
├─────────────┤
│ Alinhamento│ padding p/ 16‑byte
└─────────────┘ ← RSP (Stack Pointer)
↓ Endereços baixos
Prólogo típico (gcc -O0):
push rbp ; salva frame anterior
mov rbp, rsp ; novo frame base
sub rsp, 0x50 ; reserva locais
Epilogo: leave
(= mov rsp, rbp; pop rbp) → ret
.
3 Escalonamento de Parâmetros
SysV AMD64
RDI RSI RDX RCX R8 R9
stack
RAX
Microsoft x64
RCX RDX R8 R9
stack
RAX
x86 (cdecl)
stack (último→primeiro)
—
EAX
4 Exploração Clássica
4.1 Buffer Overflow (Stack Smashing)
Overwrite variáveis locais → RBP → endereço de retorno.
Redirecione
RIP
para:shellcode na própria stack (NX off).
ROP chain (NX on).
4.2 Stack Pivot
Utiliza gadget
pop rsp; ret
ouleave; ret
para moverRSP
para região controlada (heap, .bss, mmap).
4.3 Stack Leak
Formatação
%p
ou leitura out‑of‑bounds expõe ponteiros → base da stack → calculo de offsets.
5 Proteções Modernas
Canary
valor random antes do RET; checado em epilogo
leak canary (FS:0x28 Linux)
NX / DEP
marca stack --x
ROP, return‑to‐libc
ASLR
random base stack
stack‑leak ou brute‑force
Shadow Stack (CET)
cópia RO de RETs
JOP / SROP
6 Ferramentas e Comandos Essenciais
GDB + pwndbg
telescope $rsp
dump stack
context
visão regs + stack
x64dbg
CPU ‣ -> Stack window
visual interativo
Valgrind/AddressSanitizer
crash log
offset exato
7 Lab Hands‑on (5 Passos)
Compilar
vuln.c
com-fno-stack-protector -z execstack
.gdb ./vuln
→ break nogets
.Enviar 100 × "A" → observar
RIP = 0x41414141
.Calcular offset (
pwntools.cyclic
).Injetar shellcode ou ROP.
8 Checklist de Maestria
9 Links Oficiais
Intel® 64 Manual, Vol. 1 §6 (Stack Operations)
SysV ABI AMD64, §3.2.2 (Process Stack)
Microsoft PE / x64 ABI, §5 (Prolog/Epilog)
Phrack #49 – “Smashing the Stack”
Glibc Stack Guard Documentation
Com domínio de stack, você transforma cada crash em oportunidade — aqui começa todo BoF, SROP, ROP, shadow‑pivot ou sigreturn café‑com‑leite. 🚀
Atualizado