Buffer Overflow: Entendendo e explorando

Neste artigo venho explicar de forma direta e com exemplos práticos como funciona um buffer overflow.

[ Hits: 41.120 ]

Por: C00L3R_ em 03/09/2008 | Blog: https://github.com/CoolerVoid


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:
  • 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;
}

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".

Página anterior     Próxima página

Páginas do artigo
   1. Introdução a buffer overflow
   2. Entendendo o primeiro exemplo
   3. Tentando estourar o buffer com chutes
   4. Chegando ao ponteiro de retorno
Outros artigos deste autor

Usando OpenBSD como desktop

Módulos de Web no Perl

Trabalhando com arquivos no Perl

Banco de dados orientados a documentos

Usando o NetBSD como desktop

Leitura recomendada

Snort + MySQL + Guardian - Instalação e configuração

Tripwire - Checando a integridade do sistema

Double Dragon: chkrootkit e portsentry, agora vai rolar pancadaria nos intrusos!

Sistemas e volumes criptografados e escondidos utilizando o TrueCrypt

Segurança em seu Linux

  
Comentários
[1] Comentário enviado por rodrigo.forte em 03/09/2008 - 09:19h

Ótimo artigo, explicou de uma forma muito clara .. parabéns.

[2] Comentário enviado por grandmaster em 03/09/2008 - 22:47h

Bem legal a explicação.

Renato de Castro Henriques
CobiT Foundation 4.1 Certified ID: 90391725
http://www.renato.henriques.nom.br

[3] Comentário enviado por DSerafim em 04/09/2008 - 14:29h

O artigo está muito bom. :-)
Eu no final do artigo encontrei uma coisa que acho que não está bem. Posso estar enganado, mas o código ASCII do carácter A acho que não é 41 e sim 65.
Eu experimentei fazer tudo como disses-te e a mim aparece sempre esta linha:
#0 0x32313039 in ?? ()
Nunca me apareceu uma linha idêntica à tua:
#0 0x080483ff in main()
O SO que experimentei foi slackware também, será que alguém me podia explicar porque acontece isto, gostava de perceber um pouco mais deste assunto.

Obrigado. :-)

[4] Comentário enviado por stremer em 04/09/2008 - 19:40h

Opa... só uma observação referente ao comentário do amigo ai de cima.
ASCII do A é 41 sim em Hexa.
65 é em decimal...

Importante estudar como funciona a pilha de uma função de um programa em C para entender um pouco melhor.

Muito legal o artigo, embora seja bem avançado não recomendado para quem nem sabe direito o que é buffer overflow....

[5] Comentário enviado por ederzm em 09/09/2008 - 23:26h

Gostei!

Vou aprofundar p/ aprofundar nesse quesito.

Vlw

[6] Comentário enviado por MAPOGOS em 25/07/2016 - 17:13h

Entendi variaveis recebendo valores e cada target tem retornos diferentes


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts