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
Was this helpful?