Buffer Overflow: Entendendo e explorando

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

[ Hits: 39.314 ]

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

Ponteiros - Saindo de Pesadelos

Usando o PF - Packet Filter

BSD Sockets em linguagem C

Bind: Explorando e evitando falhas

Usando OpenBSD como desktop

Leitura recomendada

Esteganografia utilizando steghide

Vazamento de informações vitais via "HP Operations Manager Perfd"

Nmap do início ao fim (parte 1)

Elaborando uma política de segurança para a empresa

Utilizando SSH com método de autenticação publickey + ssh-agend + ssh-add

  
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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts