Pular para o conteúdo

Buffer Overflow: Entendendo e explorando

Neste artigo venho explicar de forma direta e com exemplos práticos como funciona um buffer overflow.
C00L3R_ Cooler_
Hits: 42.886 Categoria: Linux Subcategoria: Segurança
  • Indicar
  • Impressora
  • Denunciar

Parte 3: Tentando estourar o buffer com chutes

Vamos tentar estourar o buffer com chutes:

./programa (executando o programa)
0123456789 (dê estes números para o programa)

Deu em nada, que coisa não? Vamos chutar um número maior:

./programa
$ 012345678901234567891234
(24 caracteres)

Deu um erro no programa -> (Core Dumped)

Um arquivo "core" é gerado automaticamente pelo sistema. Seria uma representação do conteúdo de memória quando ocorre o erro. Se o buffer não foi estourado, limite ele com comando:

ulimit -c 99999

e tente provocar a falha novamente...

Estourado o buffer vamos ler o core, isso pode ser feito com GDB. Se não estiver instalado no seu sistema, pode ser obtido com apt-get, emerge, pacman, yum ou seu gerenciador de pacotes predileto. Depende da sua distro, no meu caso o GDB veio como padrão no Slackware, instalei a versão "full".

Continuando, dê o comando:

gdb programa core

Feito isso ele mostrará várias informações, entre elas um "Main":

#0 0x080483ff in main()

É o que nos interessa, pois esta linha nos mostra o primeiro ponteiro ou registrador fora do segmento de memória do buffer afetado, no nosso caso o registrador "EIP".

O endereço pode variar dependendo do sistema e de como o código foi escrito...

   1. Introdução a buffer overflow
   2. Entendendo o primeiro exemplo
   3. Tentando estourar o buffer com chutes
   4. Chegando ao ponteiro de retorno

Trabalhando com arquivos no Perl

Usando o NetBSD como desktop

Usando OpenBSD como desktop

Módulos de Web no Perl

BSD Sockets em linguagem C

Hotspot rápido com Coovachilli

Slackware vs PAM

Verificação de integridade de arquivos - Ferramenta OSSEC

Aplicação do firmware intel-microcode no Slackware

Personalizando o HLBR - IPS invisível

#1 Comentário enviado por rodrigo.forte em 03/09/2008 - 09:19h
Ótimo artigo, explicou de uma forma muito clara .. parabéns.
#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

Entre na sua conta para comentar.