Buffer Overflow: Entendendo e explorando

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

[ Hits: 41.093 ]

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


Chegando ao ponteiro de retorno



Até aqui já transbordamos o buffer e provocamos a quebra do programa, agora resta saber o que fazer para chegar ao ponteiro de retorno...

Bem, tente executar o programa de novo informando a variável "012345678901234567891234AAAAA". Vai dar "core dumped" de novo, daí passe o GDB de novo e terá uma nova:

#0 0x08040041 in ?()

Em ASCII a letra A seria 41. Chegamos ao ponteiro de retorno a partir de 29 bytes. Se aumentar os caracteres "A", o ponteiro será sobrescrito...

Dica: Para "disassemblar", basta o comando "gdb programa", depois o comando "disass main", assim ele irá "disassemblar" o programa principal.

Outra dica: Se você possui o código-fonte de um programa vulnerável em mãos, pode usar um truque para descobrir o endereço em que o buffer está. Ex.:

printf("0x%x\n",(int) buffer);

Onde está buffer você coloca o nome do programa. Assim sempre que o buffer for usado, o endereço aparecerá na tela.

Primeiros passos para criar um exploit de buffer overflow:
  • Pegar uma source vulnerável e analisar bem;
  • Determinar o endereço do buffer vulnerável;
  • Fazer um ou 2 loops com "for" para ir adicionando as variáveis;
  • Escolher um shellcode, mas antes disso testar como exploit local antes de deixar remoto com algumas libs.

Bem, isto só foi uma introdução a buffer overflow, em outras palavras só foi um pontapé. Na internet tem muito material para o estudo do mesmo.

Como exemplo:
Página anterior    

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

Bind: Explorando e evitando falhas

Usando OpenBSD como desktop

Ponteiros - Saindo de Pesadelos

Banco de dados orientados a documentos

Leitura recomendada

Bloqueio de usuários com o chroot

Analizando os logs do IPTables

Integridade dos arquivos do sistema

Instalando um firewall em ambientes gráficos leves

Bind: Explorando e evitando falhas

  
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