# GDB

Gdb é o acrônimo para Gnu Project Debugger. Ele é, como o nome diz, um debugger (depurador), que pode ser utilizado em engenharia reversa para obter o assembly e analisar arquivos binários.

### Rodando e obtendo o Assembly (Disassembling)

Para abrir o programa, execute:

```
gdb nomeDoPrograma
```

Por padrão, o gdb utiliza a sintaxe AT\&T. Como nós vamos utilizar principalmente a sintaxe da Intel, podemos alterar usando:

```
set disassembly-flavor intel
```

Para obter o assembly de uma função (por exemplo, a 'main'), devemos usar:

```
disassemble main
```

É importante notar que o programa será mostrado do jeito que está em memória, porém podemos utilizar outros softwares para visualizar melhor o fluxo do programa.

### GDB - Principais Comandos

Apertar somente 'Enter' é equivalente a digitar e rodar o último comando novamente. (é bem útil quando precisamos repetir o mesmo comando diversas vezes).

#### Controle de Fluxo

* `run arg1, arg2...`  &#x20;

```
     Roda o programa, passando os argumentos arg1, arg2... (pode ser utilizado sem os argumentos também)
```

* `break *address`  &#x20;

```
     Define um breakpoint no endereço dado. Pode também ser utilizado passando o nome da função ao invés do endereço
```

* `del`  &#x20;

```
     Remove todos os breakpoints
```

* `si`  &#x20;

```
     Executa a instrução atual
```

* `ni`  &#x20;

```
     Igual o si, porém não mostra a execução de chamadas de função (caso a instrução seja uma chamada de função, ele continua executando até o retorno da chamada)
```

* `set $eax=x`  &#x20;

```
     Define o valor do registrador \(eax por exemplo\) para o valor dado 'x'
```

* `define hook-stop`  &#x20;

```
     Define uma ação para acontecer sempre que a execução parar (um 'stop'), como o exemplo:
```

```
  define hook-stop
  info registers
  x/24wx $esp
  x/2i $eip
  end
```

#### Registradores

* `info registers`  &#x20;

```
     Mostra o valor dos registradores do programa
```

* `x/wx $reg`  &#x20;

```
     Mostra o conteúdo de "reg" em hexadecimal
```

* `x/s $reg`  &#x20;

```
     Mostra o conteúdo de "reg" em ascii
```

* `x/24wx $esp`   &#x20;

```
     Mostra parte da stack do programa \(24 words, no exemplo\)
```

* `x/2i $eip`  &#x20;

```
     Mostra as próximas duas instruções
```

* `x NomeDaFunção`  &#x20;

```
     Mostra o endereço da função
```

* `p NomeDaFunção`  &#x20;

```
     Mostra o endereço e o tipo de retorno da função
```

* `info proc mappings`  &#x20;

```
     Mostra o mapa da memória
```
