Buffer Overflow: Entendendo e explorando
Neste artigo venho explicar de forma direta e com exemplos práticos como funciona um buffer overflow.
Parte 2: Entendendo o primeiro exemplo
Olhando de primeira o que deixa confuso é o shellcode, que nada mais é do que um código malicioso a ser executado para ter controle do alvo. Para ser bem claro devee colocar no buffer o código já compilado, ou seja, "Assembly". Dessa forma fazemos o processador da máquina executar o que quisermos.
Para a criação de um shellcode é preciso ter conhecimentos avançados em Assembly e do sistema operacional a ser explorado, o que não é fácil, mas pode ser encontrado para ganho de conhecimento neste fórum na parte de downloads, apostilas.
Voltando ao "Buffer Overflow", vou criar um programinha bobo em "C" para explicar isso. Vamos ver uma lista de funções vulneráveis em "C" para estarmos explorando Buffer Overflow:
Encontrando uma destas funções no programa é só tentar explorar a falha. Por exemplo, o código:
Aqui vamos usar o sistema Slackware Linux para estar testando, não testei no OpenBSD porque ele bloqueia buffers elevados, por isso é bom conhecer o sistema operacional usado.
Bem, de primeira, ao fazer o programa com o "vi", logo fui compilar:
gcc -o programa programa.c
Já veio um aviso falando que contém string perigosa etc. Até aí tudo bem, já sabemos que a string é "hot" e está vulnerável a "Buffer Overflow".
Para a criação de um shellcode é preciso ter conhecimentos avançados em Assembly e do sistema operacional a ser explorado, o que não é fácil, mas pode ser encontrado para ganho de conhecimento neste fórum na parte de downloads, apostilas.
Voltando ao "Buffer Overflow", vou criar um programinha bobo em "C" para explicar isso. Vamos ver uma lista de funções vulneráveis em "C" para estarmos explorando Buffer Overflow:
- strcpy e strncopy;
- strcat e strncat;
- gets, getws e fgets.
- scanf, printf e suas variantes (fprintf, sprintf, vprintf);
- E muitas outras funções que não lembro.
Encontrando uma destas funções no programa é só tentar explorar a falha. Por exemplo, o código:
#include <stdio.h>
void malandro(void)
{
char buffer[5];
gets (buffer);
printf("%s\n",buffer);
return;
}
main()
{
malandro();
return 0;
}
void malandro(void)
{
char buffer[5];
gets (buffer);
printf("%s\n",buffer);
return;
}
main()
{
malandro();
return 0;
}
Aqui vamos usar o sistema Slackware Linux para estar testando, não testei no OpenBSD porque ele bloqueia buffers elevados, por isso é bom conhecer o sistema operacional usado.
Bem, de primeira, ao fazer o programa com o "vi", logo fui compilar:
gcc -o programa programa.c
Já veio um aviso falando que contém string perigosa etc. Até aí tudo bem, já sabemos que a string é "hot" e está vulnerável a "Buffer Overflow".