BO Flashcards
Programas em c armazenam dados em 4 lugares
Stack → Variáveis locais
Heap → Memórias dinâmica (malloc, new)
Data → Variáveis globais inicializadas
Bss → variáveis globais não inicializadas
fatores que contribui para BO
- Grande numero de funções não seguras, como gets(), strcpy(), sprintf(),scanf()
- Programação não segura é ensinada nas aulas e por alguns livros.
Heap Overflows
Heap → zona de memoria onde são guardados dados dinâmicos. Exemplo: malloc
O overflow apenas iria acontecer para as zonas mais altas de memoria
- Str está mais abaixo na memoria do que a variável critical
char str
chat critical
Stack Overflows
e exemplo ataque
Stack → Zona de memoria onde são tipicamente guardados os argumentos, as variáveis locais e o endereço de retorno
das funções.
2-
- Precisamos de colocar lixo, neste caso caracter x, durante 17 posições de memoria. O que nos permite chegar
a posição de memoria que guarda o endereço de retorno!
2.De seguida colocamos nas posições o endereço de memoria que queremos que seja guardada no sitio de
memoria onde se encontra o “ret address” que neste caso iremos escreve o endereço de memoria da função
cannot. - Memoria: dados, saved rbp, ret adress
Internal BOs
BO podem acontecer no código dos utilizadores, mas também em buffer de qualquer modulo ligado ao nosso
programa. Como por exemplo de bibliotecas.
Exemplo. realpath
Soluções para proteção de BO
Address space layout randomization (ASLR)
O endereço inicial do espaço de endereçamento muda sempre que executamos o código. Isto previne: endereços
específicos sejam sobrescritos, localizar código específico.
Data Execution Prevention (DEP)
W (+) X, where W = write; X = execute
As paginas da stack apenas podem ser escrits/lidas, nunca executadas
Os segmentos de código podem ser executados, mas não escritos.
Canaries
Coloca valores especiais (não determinísticos) antes e depois dos lugares que queremos proteger na memoria.
Depois confirmamos que estes canários não foram alterados antes de acedermos à memoria protegida!
Control Flow Integrity
CFI restringe o control-flow de uma aplicação para validar os seus execution traces.
Realiza isto em runtime, monitorando o programa e comparado o seu estado com o uma serie de estados válidos pré
computados.
Se alguma anomalia é detetada, um alerta é ativado e a aplicação termina.
Control-flow hijack attack → Redireciona o control-flow de uma aplicação para uma localização que não seria
alcançável no início da execução. Para injetar código.
O CFI tenta prevenir estes ataques, limitando os targets de transferências de control flow.
Advanced Overflows
Arc injection or return-to-libc Return-Oriented Programming (ROP) Heap Spray Modify a Pointer Use-After-Free Off-by-one Errors
DOWNCASTING OVERFLOWS
C++: Upcasting and downcasting Type Cast operator → é um operador que força um tipo de dados a ser convertido noutro tipo de dados. C++ suporta dois tipos: Static Cast; Dynamic Cast; Const Cast; Reinterpret Cast a) Upcasting → da derived class para parent class b) Downcasting → da parent class para uma das derived classes
upcast é sempre seguro.
INTEGER OVERFLOWS
Overflow
Underflow
Signedness error
Truncation