pwndbg (pronunciado “pwn-dee-bee-gee”) é um plugin Python que carrega no GDB — e agora também no LLDB — para tornar o desenvolvimento de exploits e engenharia reversa muito menos doloroso. Ele adiciona inspeção de heap, busca de gadgets ROP, “telescoping” de registradores/pilha/ponteiros, uma exibição de contexto inteligente a cada parada, e dezenas de comandos que os debuggers nunca forneceram. É um sucessor espiritual do PEDA e um irmão do GEF.
Instalação
| Método | Comando |
|---|
| Script de configuração (recomendado) | git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh |
| Nix | nix profile install github:pwndbg/pwndbg |
| Arch (AUR) | yay -S pwndbg |
| Carregamento manual do GDB | adicione source /path/to/pwndbg/gdbinit.py a ~/.gdbinit |
| LLDB | adicione command script import /path/to/pwndbg/lldbinit.py a ~/.lldbinit |
| Verificar | inicie gdb — você deve ver o prompt pwndbg> |
Iniciando uma Sessão
| Comando | Descrição |
|---|
gdb ./binary | Carrega um binário sob pwndbg |
gdb -p PID | Anexa-se a um processo em execução |
gdb ./binary core | Abre um core dump para análise pós-morte |
start | Executa e quebra em main |
entry | Executa e quebra no ponto de entrada do ELF |
r ARGS | Executa com argumentos |
starti | Para na primeira instrução |
Contexto e Navegação
| Comando | Descrição |
|---|
context | Redesenha o contexto completo (regs, disasm, stack, backtrace) |
context reg | Mostra apenas o painel de registradores |
ctx-watch EXPR | Adiciona uma expressão ao painel de observação do contexto |
nextcall | Passa até a próxima instrução call |
nextret | Passa até o próximo ret |
stepuntilasm mov | Passa até um mnemônico específico |
xinfo ADDR | Explica o que um endereço mapeia (qual mapping/seção) |
Inspeção de Memória
| Comando | Descrição |
|---|
telescope ADDR | Desreferencia e “telescopa” uma cadeia de ponteiros |
telescope $sp 20 | Telescopa 20 entradas do stack pointer |
hexdump ADDR | Despejo hex+ASCII (o comando que o GDB nunca teve) |
vmmap | Mostra o mapa de memória virtual do processo |
vmmap libc | Filtra o mapa de memória por nome |
search -t string "PASS" | Busca na memória por uma string |
search -t bytes 0xdeadbeef | Busca na memória por um padrão de bytes |
distance ADDR1 ADDR2 | Distância em bytes entre dois endereços |
p2p MAP1 MAP2 | Encontra cadeias de ponteiros entre dois mappings |
Análise de Heap (glibc)
| Comando | Descrição |
|---|
heap | Lista chunks de heap |
bins | Mostra todos os free bins (fast, tcache, small, large, unsorted) |
tcache | Inspeciona o tcache |
fastbins | Mostra o conteúdo do fastbin |
malloc_chunk ADDR | Decodifica um header de chunk em um endereço |
top_chunk | Mostra o chunk superior (wilderness) |
vis_heap_chunks | Visualiza o layout do heap com cores |
find_fake_fast ADDR | Procura por alvos de fake-chunk do fastbin |
Desenvolvimento de Exploits
| Comando | Descrição |
|---|
cyclic 200 | Gera um padrão De Bruijn (localizador de offset) |
cyclic -l 0x6161616c | Procura o offset de um valor no padrão |
rop --grep "pop rdi" | Busca gadgets ROP |
ropgadget | Despeja gadgets (integração ROPgadget) |
checksec | Mostra mitigações binárias (NX, PIE, RELRO, canary) |
got | Mostra a GOT e endereços resolvidos |
plt | Mostra a PLT |
aslr | Mostra/alterna ASLR para o debugee |
canary | Mostra o valor atual do canary de pilha |
Breakpoints e Watchpoints
| Comando | Descrição |
|---|
b *0x401136 | Quebra em um endereço absoluto |
b main | Quebra em um símbolo |
breakrva 0x1136 | Quebra em um RVA (útil com PIE) |
watch GLOBAL | Quebra quando um valor muda |
rwatch ADDR | Quebra no acesso de leitura |
ignore N COUNT | Ignora um breakpoint N vezes |
Fluxos de Trabalho Comuns
# Encontra o offset exato para sobrescrever um endereço de retorno salvo
pwndbg> cyclic 200
pwndbg> r # cole o padrão, crash
pwndbg> cyclic -l $rsp # relata o offset
# Inspeciona mitigações, então procura por uma cadeia ROP amigável a one-gadget
pwndbg> checksec
pwndbg> rop --grep "pop rdi"
# Caminha por um use-after-free de heap
pwndbg> vis_heap_chunks
pwndbg> bins
pwndbg vs GEF vs PEDA
| Feature | pwndbg | GEF | PEDA |
|---|
| Suporte a GDB | Sim | Sim | Sim |
| Suporte a LLDB | Sim | Não | Não |
| Análise de heap | Profunda (glibc) | Boa | Limitada |
| Ferramentas ROP | Built-in | Built-in | Built-in |
| Desenvolvimento ativo | Sim | Sim | Mínimo |
Recursos