Buffer Overflow: Entendendo e explorando

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

[ Hits: 41.119 ]

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

BSD Sockets em linguagem C

Usando o PF - Packet Filter

Bind: Explorando e evitando falhas

Apache + PHP + MySQL + ftpd no OpenBSD

Trabalhando com arquivos no Perl

Leitura recomendada

Instalando e configurando o Nagios 3.3.1 com NDOUtils 1.4

SELinux - Security Enhanced Linux

Melhorando a segurança do Firewall com Bridges usando Snort_Inline no Debian Etch

PuTTY - Estabelecendo Chave Secreta com OpenSSH

Netcat - O canivete suíco do TCP/IP

  
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