Então o cara desse vídeo:
https://www.youtube.com/watch?v=1S0aBV-Waeo
estourou a pilha, adulterou o endereço de retorno, apontou-o na pilha e copiou o código executável na pilha com um deslizamento NOP
mas eu pensei que todos os sistemas linux modernos, incluindo os debian, têm uma defesa contra isso usando um tipo de bit NX (não executável) na tabela de páginas e usando essas instruções de parada como essa para trabalhar na pilha? Ou eu estou esquecendo de alguma coisa?
Páginas não executáveis (NX-bit) é um recurso de hardware. Permite que o sistema operacional marque quais páginas podem ser executadas. Falha do processador se o programa tentar executar código na página de memória não executável.
Além disso, se a pilha é/não é executável depende também das opções do compilador (e do binário resultante). As distribuições Linux modernas permitem muitas técnicas de proteção para binários de espaço de usuário, como pilhas não executáveis, canários de pilha, randomização de layout de espaço de endereço. Por exemplo , proteção do espaço do usuário do Ubuntu .
É possível compilar seus binários com pilha executável e sem canários de pilha para possibilitar estouros de pilha, como foi feito para o exemplo de vídeo (não foi possível ver o programa compilado/quais opções foram usadas, mas por padrão o gcc não deve habilitar pilhas executáveis para um programa tão simples).
Além disso, o SELinux (e outros módulos de segurança do Linux) também podem ser configurados para impedir que o sistema execute binários que exigem memória executável+gravável (heap ou pilha).
O bit NX foi introduzido apenas na arquitetura x86_64, não existe nos processadores Intel/AMD de 32 bits. Claro, praticamente todo mundo está rodando PCs de 64 bits hoje em dia, mas ninguém parece ter informado os blogueiros e vloggers por aí que ainda insistem em explicar as coisas no contexto do velho mundo 386.