Gerência de Redes de
Computadores
- Ataques Remotos-
Buffer Overflow
Prof. André Peres
andre.peres@poa.ifrs.edu.br
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 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
inicia 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 buffer
de 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 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ção
& cód após proc
retorno
PC <- & 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ção
continua 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 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
inicia 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 buffer
de 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 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ção
& cód após proc
resto do proc
buffer
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 proc
buffer
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 proc
buffer
*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 proc
buffer
*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
retorno
PC <- & 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 malicioso
executado
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
Ataques de Buffer Overflow
• Buffer Overflow → conceitos
• Heap:
• Estouro Acidental:
• erro em qualquer processo que estiver usando a
área da memória invadida (o SO deve proteger)
• Estouro Malicioso
• execução de código malicioso
• privilégios do processo explorado

9 - segurança - ataques buffer-injection

  • 1.
    Gerência de Redesde Computadores - Ataques Remotos- Buffer Overflow Prof. André Peres andre.peres@poa.ifrs.edu.br
  • 2.
    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/.
  • 3.
    Ataques de BufferOverflow • 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
  • 4.
    Ataques de BufferOverflow • 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];
  • 5.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: Código (RO) Dados (RW) Stack (RW)
  • 6.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 7.
    Ataques de BufferOverflow • 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); }
  • 8.
    Ataques de BufferOverflow • 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
  • 9.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função chama proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 10.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função cód após proc & cód após proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 11.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc inicia proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 12.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc cria var buffer de 10 bytes buffer void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 13.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 14.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc retorno PC <- & cód após proc buffer void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 15.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função continua de onde parou void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 16.
    Ataques de BufferOverflow • 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); }
  • 17.
    Ataques de BufferOverflow • 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
  • 18.
    Ataques de BufferOverflow • 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); }
  • 19.
    Ataques de BufferOverflow • 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
  • 20.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função chama proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 21.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função cód após proc & cód após proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 22.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc inicia proc void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 23.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc cria var buffer de 10 bytes buffer void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 24.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 25.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer buffer Usuário entra com volume de dados maior que 10 bytes void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 26.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer 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); }
  • 27.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer *cód malicioso* buffer o conteúdo extra possui código malicioso void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 28.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc resto do proc buffer *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); }
  • 29.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc buffer *cód malicioso* & cod mal retorno PC <- & cód malicioso void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 30.
    Ataques de BufferOverflow • Buffer Overflow → conceitos Processo: principal Dados (RW) Stack (RW) função & cód após proc buffer *cód malicioso* & cod malcód malicioso executado void proc1 () { char buffer[10]; … } int main (void) { ... proc1 (); ... exit(0); }
  • 31.
    Ataques de BufferOverflow • 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
  • 32.
    Ataques de BufferOverflow • 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];
  • 33.
    Ataques de BufferOverflow • 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
  • 34.
    Ataques de BufferOverflow • Buffer Overflow → conceitos • Heap: • Estouro Acidental: • erro em qualquer processo que estiver usando a área da memória invadida (o SO deve proteger) • Estouro Malicioso • execução de código malicioso • privilégios do processo explorado