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 regsNOTA: 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" >> ~/.gdbinitComandos Básicos
Exibindo o código fonte
listIMPORTANTE: 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 variablesVendo as functions do binário
info functions
# ou
i fAbaixo, 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 mainVisualiza os endereços de memória que o programa está ocupando
info proc mappingsDefinindo novos valores paras os registadores
set $eip = 0x00112233Argumentos
# Defininado argumentos antes de executar
set args <arg1> <arg2> ... <argX>
# Resetando os argumentos
set argsRegistradores
# 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)
tPor 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* 0x00112233Deletando todos os breakpoints
del
# ou
dIndo 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
siIndo para o próximo breakpoint
cExecutando 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/pedaLast updated
Was this helpful?