> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/pwn/protections/shadow-stack.md).

# Shadow stack

Une **shadow stack** est un mécanisme de protection de l'intégrité du flux d'exécution d'un programme (pour se protéger d'attaques [Stack buffer overflow](/cyber/pwn/stack/stack-buffer-overflow.md)). C'est une **deuxième pile** qui ne **contient que des copies d'adresses de retour** et vérifie leur intégrité à la fin de chaque fonction.

Quand une fonction est appelée, son adresse de retour est mise **sur la stack et sur la shadow stack**. Dans son épilogue **elle récupère l'adresse sur les 2 piles et les compare**. Si elles diffèrent, une attaque a eu lieu. Dans ce cas le programme se termine ou un message alerte de la tentative d'exploitation.

La **shadow stack** est protégée et cachée de l'exécution normale pour être difficile d'accès pour un attaquant.

Cette protection est plus forte que le [Stack canary](/cyber/pwn/protections/stack-canary.md) car elle ne se base pas sur un secret et protège contre les overflow non linéaires.
