# Print Stack Canary {{#include ../../../banners/hacktricks-training.md}} ## Aumentar a pilha impressa Imagine uma situação onde um **programa vulnerável** a estouro de pilha pode executar uma função **puts** **apontando** para **parte** do **estouro de pilha**. O atacante sabe que o **primeiro byte do canário é um byte nulo** (`\x00`) e o restante do canário são **bytes aleatórios**. Então, o atacante pode criar um estouro que **sobrescreve a pilha até o primeiro byte do canário**. Em seguida, o atacante **chama a funcionalidade puts** no meio do payload que irá **imprimir todo o canário** (exceto o primeiro byte nulo). Com essa informação, o atacante pode **elaborar e enviar um novo ataque** conhecendo o canário (na mesma sessão do programa). Obviamente, essa tática é muito **restrita** já que o atacante precisa ser capaz de **imprimir** o **conteúdo** de seu **payload** para **exfiltrar** o **canário** e então ser capaz de criar um novo payload (na **mesma sessão do programa**) e **enviar** o **verdadeiro estouro de buffer**. **Exemplos de CTF:** - [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) - 64 bits, ASLR habilitado mas sem PIE, o primeiro passo é preencher um estouro até o byte 0x00 do canário para então chamar puts e vazá-lo. Com o canário, um gadget ROP é criado para chamar puts e vazar o endereço de puts do GOT e um gadget ROP para chamar `system('/bin/sh')` - [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html) - 32 bits, ARM, sem relro, canário, nx, sem pie. Estouro com uma chamada para puts nele para vazar o canário + ret2lib chamando `system` com uma cadeia ROP para pop r0 (arg `/bin/sh`) e pc (endereço de system) ## Leitura Arbitrária Com uma **leitura arbitrária** como a fornecida por **strings** de formato, pode ser possível vazar o canário. Confira este exemplo: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) e você pode ler sobre abusar de strings de formato para ler endereços de memória arbitrários em: {{#ref}} ../../format-strings/ {{#endref}} - [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html) - Este desafio abusa de uma maneira muito simples uma string de formato para ler o canário da pilha {{#include ../../../banners/hacktricks-training.md}}