Pular para o conteúdo

pwndbg - Cheatsheet de Desenvolvimento de Exploits com GDB/LLDB

pwndbg - Cheatsheet de Desenvolvimento de Exploits com GDB/LLDB

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étodoComando
Script de configuração (recomendado)git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh
Nixnix profile install github:pwndbg/pwndbg
Arch (AUR)yay -S pwndbg
Carregamento manual do GDBadicione source /path/to/pwndbg/gdbinit.py a ~/.gdbinit
LLDBadicione command script import /path/to/pwndbg/lldbinit.py a ~/.lldbinit
Verificarinicie gdb — você deve ver o prompt pwndbg>

Iniciando uma Sessão

ComandoDescrição
gdb ./binaryCarrega um binário sob pwndbg
gdb -p PIDAnexa-se a um processo em execução
gdb ./binary coreAbre um core dump para análise pós-morte
startExecuta e quebra em main
entryExecuta e quebra no ponto de entrada do ELF
r ARGSExecuta com argumentos
startiPara na primeira instrução

Contexto e Navegação

ComandoDescrição
contextRedesenha o contexto completo (regs, disasm, stack, backtrace)
context regMostra apenas o painel de registradores
ctx-watch EXPRAdiciona uma expressão ao painel de observação do contexto
nextcallPassa até a próxima instrução call
nextretPassa até o próximo ret
stepuntilasm movPassa até um mnemônico específico
xinfo ADDRExplica o que um endereço mapeia (qual mapping/seção)

Inspeção de Memória

ComandoDescrição
telescope ADDRDesreferencia e “telescopa” uma cadeia de ponteiros
telescope $sp 20Telescopa 20 entradas do stack pointer
hexdump ADDRDespejo hex+ASCII (o comando que o GDB nunca teve)
vmmapMostra o mapa de memória virtual do processo
vmmap libcFiltra o mapa de memória por nome
search -t string "PASS"Busca na memória por uma string
search -t bytes 0xdeadbeefBusca na memória por um padrão de bytes
distance ADDR1 ADDR2Distância em bytes entre dois endereços
p2p MAP1 MAP2Encontra cadeias de ponteiros entre dois mappings

Análise de Heap (glibc)

ComandoDescrição
heapLista chunks de heap
binsMostra todos os free bins (fast, tcache, small, large, unsorted)
tcacheInspeciona o tcache
fastbinsMostra o conteúdo do fastbin
malloc_chunk ADDRDecodifica um header de chunk em um endereço
top_chunkMostra o chunk superior (wilderness)
vis_heap_chunksVisualiza o layout do heap com cores
find_fake_fast ADDRProcura por alvos de fake-chunk do fastbin

Desenvolvimento de Exploits

ComandoDescrição
cyclic 200Gera um padrão De Bruijn (localizador de offset)
cyclic -l 0x6161616cProcura o offset de um valor no padrão
rop --grep "pop rdi"Busca gadgets ROP
ropgadgetDespeja gadgets (integração ROPgadget)
checksecMostra mitigações binárias (NX, PIE, RELRO, canary)
gotMostra a GOT e endereços resolvidos
pltMostra a PLT
aslrMostra/alterna ASLR para o debugee
canaryMostra o valor atual do canary de pilha

Breakpoints e Watchpoints

ComandoDescrição
b *0x401136Quebra em um endereço absoluto
b mainQuebra em um símbolo
breakrva 0x1136Quebra em um RVA (útil com PIE)
watch GLOBALQuebra quando um valor muda
rwatch ADDRQuebra no acesso de leitura
ignore N COUNTIgnora 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

FeaturepwndbgGEFPEDA
Suporte a GDBSimSimSim
Suporte a LLDBSimNãoNão
Análise de heapProfunda (glibc)BoaLimitada
Ferramentas ROPBuilt-inBuilt-inBuilt-in
Desenvolvimento ativoSimSimMínimo

Recursos