# Proteções

## Proteções da stack

Agora que sabemos de alguns ataques, vamos olhar algumas das formas de proteção contra tais ataques.

Nos exemplos de buffer overflow, compilamos nossos programas com `-fno-stack-protector`. Isso evita que o GCC compile nosso programa com o `-fstack-protector`.

Essa proteção coloca todos os buffers entre as variáveis normais e os registradores salvos na stack (como o ebp). Dessa forma, ela evita que as variáveis normais sejam sobrescritas por um buffer overflow. Além disso, ela também coloca um espaço extra no fim do stack frame, chamado de stack canary, que é atribuido um valor secreto que muda toda vez que o programa é executado. No fim da função, esse valor será verificado e caso tenha sido alterado, a função `__stack_chk_fail()` será chamada, exibindo uma mensagem de erro de stack smashing e finalizará o programa.

Há também o NX bit, que previne a execução de certas áreas da memória, impedindo assim a execução de shellcodes nessas áreas. A stack costuma ser uma das regiões de memória protegidas pelo NX bit. Quando estavamos vendo shellcode, compilamos o programa com `-z execstack` e também usamos o `execstack -s` para removê-lo. Podemos habilita-lo explicitamente com `-z noexecstack` e `execstack -c`.

## PIC/PIE e ASLR

Além de delimitações de buffer que o programador pode colocar para evitar buffer overflow e proteções da stack, há algumas medidas de segurança para evitar execução de código arbitrário também. Uma delas é o **ASLR**. Mas antes de falar sobre ASLR, vamos falar sobre o **PIE**.

**Position-Independent Executable (PIE)** são binários executáveis que fazem o uso de **Position-Independent Code (PIC)** em todo seu código.

Position-Independent Code, como o nome diz, são códigos que não dependem de sua posição para serem executados, ou seja, seu endereço não é hard-coded no código do programa.

O ASLR, Address Space Layout Randomization, é uma técnica de segurança que aleatorializa as posições das regiões da memória, como por exemplo a stack, a heap e as bibliotecas compartilhadas. Isso deixa os endereços mais difíceis de serem adivinhados por um atacante, dificultando ataques envolvendo mudança do fluxo de execução e de escrita arbitrária. O PIE fornece uma maior eficácea para o ASLR, já que funções do executável principal também recebem o tratamento de bibliotecas compartilhadas e, portanto, podem ser randomizadas pelo ASLR.

O PIE pode ser habilitado com a flag de compilação `-pie` e desabilitado com `-no-pie`. O ASLR pode ser habilitado mudando o `/proc/sys/kernel/randomize_va_space` para 2 e desabilitado mudando para 0.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.ganeshicmc.com/pwning/protecoes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
