# 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.ganeshicmc.com/engenharia-reversa/gdb.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
