Upload
andre-peres
View
269
Download
2
Embed Size (px)
Citation preview
Sobre este material
• Vídeos da apresentação em:
https://youtu.be/8L5nKkd_rhw
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-NãoComercial-SemDerivações 4.0 Internacional. Para ver uma
cópia desta licença, visite http://creativecommons.org/licenses/by-nc-nd/4.0/.
Ataques de Buffer Overflow
• Buffer Overflow
• Estouro de buffer:
• atribuição de volume dados de tamanho superior ao espaço reservado em memória
• causa: falta de verificação no código dos programas
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
• pilha (stack): • cada processo possui uma pilha• estrutura FILO (first in last out)• bloco contínuo de memória junto ao processo• utilizada para:
• armazenamento de parâmetros de funções• variáveis locais de funções/proc• valores para retorno da função (endereços de
retorno)
ex: int exArray[10];
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
Código (RO)
Dados (RW)
Stack (RW)
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
Início do prog
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
código inicial
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
chama proc
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função cód após proc
& cód após procvoid proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após procinicia proc void proc1 () {
char buffer[10];…
}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
cria var bufferde 10 bytes
buffer
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
retornoPC <- & cód após proc
buffer
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
funçãocontinua de onde parou
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função segue o código
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
void proc1 () { char buffer[10];
…}
int main (void) { int i=0; proc1 ();
... exit(0);}
Overflow
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
Início do prog
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
código inicial
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
chama proc
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função cód após proc
& cód após procvoid proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após procinicia proc void proc1 () {
char buffer[10];…
}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
cria var bufferde 10 bytes
buffer
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
buffer
Usuário entra com volume de dados
maior que 10 bytes
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
buffer
buffer
Invade a área da pilha e escreve sobre o endereço de retorno
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
*cód malicioso*
buffer
o conteúdo extra possui código malicioso
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
resto do procbuffer
*cód malicioso*
& cod mal
e o novo endereço de retorno aponta para este código !!!!
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
buffer
*cód malicioso*
& cod mal
retornoPC <- & cód malicioso
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
Processo:
principal
Dados (RW)
Stack (RW)
função
& cód após proc
buffer
*cód malicioso*
& cod malcód maliciosoexecutado
void proc1 () { char buffer[10];
…}
int main (void) {...
proc1 ();...
exit(0);}
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
• pilha (stack): • Estouro Acidental:
• erro no programa → programa finaliza• mensagem de estouro de buffer (SO)
• Estouro Malicioso• execução de código malicioso• privilégios do processo explorado
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
• Heap:• área de memória do sistema operacional• alocada dinamicamente pelos processos
• não é necessário reservar memória na compilação
• alocada explicitamente (new/malloc/calloc)
ex: int* exArray = new int[10];
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
• Heap:• a memória é alocada em blocos (chunks)• os blocos são interligados via ponteiros
• os ponteiros estão em um cabeçalho (header)• overflow de um bloco permite alterar o header
do próximo bloco (ex: ponteiros)• o atacante consegue incluir chunks controlados
por ele na estrutura alterando os ponteiros• o atacante consegue unir chunks provocando o
overflow na pilha ⇒ alteração do endereço de retorno