Buffer Overflow: Entendendo e explorando

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

[ Hits: 41.389 ]

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


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

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

Trabalhando com arquivos no Perl

Módulos de Web no Perl

Usando OpenBSD como desktop

Banco de dados orientados a documentos

Usando o NetBSD como desktop

Leitura recomendada

Aquisição Estática de Dados em Computação Forense

Passkeys: A Evolução da Autenticação Digital

Bind: Explorando e evitando falhas

Metasploit Framework

Labrador, um detector de intrusos

  
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