GDB

Entre no GDB antes de continuar. Para acessar, basta executar o comando gdb. Caso queira instale também o peda, para deixar o GDB com um visual mais amigável.

Outro recurso que podemos utilizar para deixar o GDB mais amigável é executando os comandos abaixo:

gdb -q <file> -tui

# Código Assembly
layout asm

# x Registradores
layout regs

NOTA: Caso queira utilizar uma ferramenta GUI, utilize o edb, com o seguinte comando: edb --run <file>

Configurando o gdb

Para deixarmos o gdb configurado para abrir sempre em formato Intel, execute os comandos:

gdb -q
set disassembly-flavor intel
quit

echo "set disassembly-flavor intel" >> ~/.gdbinit

Comandos Básicos

Exibindo o código fonte

list

IMPORTANTE: Essa opção provavelmente não estará disponível, pois ninguém quer deixar um programa compilado que deixe exibir o códgo fonte. Para deixar essa leitura disponível, utilize o seguinte comando para compilar: gcc -g <file.c> -o <file>

Exibindo as variáveis

info variables

Vendo as functions do binário

info functions
# ou
i f

Abaixo, algumas maneiras de executar o programa de forma normal, com parâmetros ou sem:

run
run <arg1> <arg2> ... <argX>
run $(<subcommand_os>)
run < <(<command>)
run < <file.txt>

Executando o programa em modo debug

start
# ou
start <arg1> <arg2> ... <argX>

Vendo o Disasseble completo de um trecho (no exemplo abaixo, usamos o main)

disassemble main
# ou
disas main

Visualiza os endereços de memória que o programa está ocupando

info proc mappings

Definindo novos valores paras os registadores

set $eip = 0x00112233

Argumentos

# Defininado argumentos antes de executar
set args <arg1> <arg2> ... <argX>

# Resetando os argumentos
set args

Registradores

# Também pode-se utilizar: i r
info registers

# Também pode-se utilizar: i r <register>
info register <register>

Examine

O comando Examine (usamos o atalho x para executá-lo), serve para examinar determinado endereço de memória de várias maneiras. Este comando espera 2 argumentos, sendo eles o local da memória a ser examinado e o segundo é como exibir essa memória. Assim como o Examine utiliza uma abreviação (x), o formato de exibição também trabalha com abreviações, sendo elas:

# Octal
o

# Hexadecimal
x

# Unsigned, por padrão decimal (base-10)
u

# Binário (texto em base-10 binário)
t

Por exemplo, para exibirmos determinado endereço de memória em Hexadecimal, execute

x/x <address_memory>

Breakpoints

Inserindo Breakpoints

break _main # Geralmente as pessoas usam o nome _main para o Entry Point
break *<main+16>
b* 0x00112233

Deletando todos os breakpoints

del
# ou
d

Indo para a próxima instrução com NI (Next Instruction) e SI (Step Instruction)

# Continua o código sem entrar no método que a linha atual está chamando
ni

# Entra no método que a linha atual está chamando
si

Indo para o próximo breakpoint

c

Executando Determinada Função

Mesmo sem o programa chegar a determinada função, podemos forçar a sua execução. Com o padrão call((<type_return>(*)()) <method_name>)(<params>), podemos fazer isso, como no exemplo abaixo:

call((void(*)()) calcula)(30)

Sites

# Tutorial do gdb (PT-BR)
http:s//www.lrc.ic.unicamp.br/~luciano/courses/mc202-2s2009/tutorial_gdb.txt

# PEDA
https://github.com/longld/peda

Last updated