<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras maneiras de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
**Se você estiver lidando com um binário protegido por um canário e PIE (Position Independent Executable), provavelmente precisará encontrar uma maneira de contorná-los.**
Observe que o **`checksec`** pode não encontrar que um binário está protegido por um canário se ele foi compilado estaticamente e não é capaz de identificar a função.\
No entanto, você pode notar manualmente isso se encontrar que um valor é salvo na pilha no início de uma chamada de função e esse valor é verificado antes de sair.
A melhor maneira de contornar um canário simples é se o binário for um programa **criando processos filhos toda vez que você estabelece uma nova conexão** com ele (serviço de rede), porque toda vez que você se conecta a ele **o mesmo canário será usado**.
Então, a melhor maneira de contornar o canário é apenas **forçá-lo caractere por caractere**, e você pode descobrir se o byte do canário adivinhado estava correto verificando se o programa travou ou continua seu fluxo regular. Neste exemplo, a função **força bruta um canário de 8 Bytes (x64)** e distingue entre um byte adivinhado correto e um byte ruim apenas **verificando** se uma **resposta** é enviada de volta pelo servidor (outra maneira em **outras situações** poderia ser usando um **try/except**):
### Exemplo 1
Este exemplo é implementado para 64 bits, mas poderia ser facilmente implementado para 32 bits.
As threads do mesmo processo também **compartilharão o mesmo token canary**, portanto será possível **forçar** um canary se o binário gerar uma nova thread toda vez que um ataque acontecer. 
Um estouro de buffer em uma função com threads protegida com canary pode ser usada para modificar o canary principal do processo. Como resultado, a mitigação é inútil porque a verificação é feita com dois canaries que são iguais (embora modificados).
### Exemplo
O programa a seguir é vulnerável a Buffer Overflow, mas está compilado com canary:
Observe que `vuln` é chamado dentro de uma thread. No GDB, podemos dar uma olhada em `vuln`, especificamente, no ponto em que o programa chama `gets` para ler os dados de entrada:
O acima representa o endereço de `data`, onde o programa escreverá a entrada do usuário. O canário da pilha é encontrado em `0x7ffff7d7ee48` (`0x493fdc653a156800`), e o endereço de retorno está em `0x7ffff7d7ee50` (`0x00007ffff7e17ac3`):
Algumas das funções GDB acima são definidas em uma extensão chamada [bata24/gef](https://github.com/bata24/gef), que possui mais recursos do que o [hugsy/gef](https://github.com/hugsy/gef) comum.
{% endhint %}
Como resultado, um grande Buffer Overflow pode permitir modificar tanto o stack canary quanto o master canary no TLS. Este é o deslocamento: