Entendendo o que é Buffer Overflow

Started by Ch1p5, 03 de June , 2006, 09:53:25 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ch1p5

Eu estava no site www.invasao.com.br e vi esse tópico. eu acho q já tem
no Darkers
flw

Entendendo o que é Buffer Overflow
 

Entendendo alguns termos técnicos

Para melhorar o entendimento sobre buffer overflow você encontar abaixo alguns termos técnico muito usados quando se fala em buffer overflow e escrita de shell codes:

Exploit:
São programas desenvolvidos para explorar falhas em softwares ou equipamentos de hardwares, são escritos geralmente em linguagens como C e perl.

Buffer:
É um bloco de memória responsável em guarda muitos pedidos de dados do mesmo tipo

RET:
é ondereço de retono(return address), ou seja, quando o programa encontra uma chamada outra função o programa ele "salta" para executa a função e depois retorna para a função de origem ao qual fez a chamada.

Heap:
É o espaço acessado pelo comando malloc() que reserva um espaço para uma variavel.

SFP:
É abreviação de Stack Frame Pointer, é o inicio do address(endereco) do stack(pilha)

Stack:
Stack nada mais é do que a fomosa pilha do processo, ela é reponsavel em armazenar informações temporariamente de uma variavel local ou ate mesmo do RET(return address).

Esp:
É um registro conhecido como pelo nome de "extended stack pointer"

Ebp:
É um registro conhecido como pelo nome de "extended base pointer"

Eip:
É um registro conhecido como pelo nome de "extended instruction pointer"

GDB:
o GDB é um programa opensource nativo do Unix que serve para debuga outros programas

GCC
Um compilador de C para linux

Perl
uma linguagem nativa do linux que também tem versões para windows é usado para desenvolvimento de alguns sistemas para a web e também par explorar vulnerabilidades em softwares.

Entendendo o buffer overflow


Bem, a palavra buffer overflow significa estouro de buffer, imagine o que aconteceria se colocássemos 800ml dentro de um recipiente que só suporta 600ml obviamente tudo depois que chega-se a 600ml transbordaria, é exatamente isso que ocorre com o buffer overflow, um transbordamento de memória, imagine que uma certa variável suporta no máximo 20 caractes, o que aconteceria se digitássemos 21 caractes? haveria um transbordamento dessa variável, ou seja, foi inserido mais dados do que o suportado pela variavel, a conseqüência disso é muito grave pois, poderíamos modificar o endereço de retorno RET(Return Address) para poder executarmos um código arbitrário na máquina, como uma chamada sehll por exemplo. Se ainda não ficou claro com ocorre o buffer overflow veja o exemplo abaixo de um programa vulnerável a tal falha:

/* Programa vulnerável ao buffer overflow
por Rodrigo Souza Delphino
*/
#include "stdafx.h"
void main()
{
char nome[20];
printf("Digite seu nome: ");
gets(nome);

printf("seja bem vindo ");
printf(nome);
}

Como podemos observar existe uma variável chamada nome que suporta 20 caractes, ou seja, se inserirmos 21 caractes haveria um transbordamento dessa variável.
 
Fonte: Invasão.com.br

Chips


"Minha impressora está normal, mas não imprime"

slul

legal,

simples e eficiente

kurumin@kurumin:/var/www$ gcc ovf.c -o ovf
ovf.c:1:20: stdafx.h: No such file or directory
ovf.c: In function `main':
ovf.c:3: warning: return type of `main' is not `int'
kurumin@kurumin:/var/www$


o kra conseguiu 3 erros num script de poucas linhas hehhee


soh se o arquivo nao for pra linux =P daew eu perdoo

HadeS

Vou tentar corrigir o erro.

/* Programa totalmente-mal-codado vulnerável ao buffer overflow
por Rodrigo Souza Delphino e corrigido por HadeS
*/
#include <stdio.h>
int main()
{
char nome[20];
printf("Digite seu nome: ");
scanf("%s",nome);

printf("seja bem vindo ");
printf("%s",nome);
}

O cara não sabe nem usar um #include.

Eu arrumei com meus poucos conhecimentos de C. :P

HadeS

slul

kurumin@kurumin:/var/www$ ./ovf
Digite seu nome: 9f834um098udc34ur8u9du498v94u958n34n5v8n4n3n8u4-9ndfhgiehgiehrgheighrighriehgiregirhgierhgiuerhihe
Segmentation fault


esse foi o buffer overflow?

obs: eu botei com menos caracteres uns 30 +- e nao deu erro hahaha

nibbles

"fonte: invasão..."

pronto, já perdoei
asdihasdihsidhsduhsdhu
aquele site é uma piada :/



"A diversão do inteligente é se fingir de burro para aquele que se finge de inteligente."
"ENGENHARIA SOCIAL. Porque não existe patch para a ignorância humana."

Ch1p5

essa foi feia mesmo!!
se vcs ñ tivesse visto antes...rs

@Slul
aki ta funfando o buffer, acho q eh por causa do linux:

C:\cygwin\bin>buffer.exe
Digite seu nome: acvsrfgrefsrgsf564er65rgsdf56ref2rgg
      3 [main] buffer 3004 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_
VIOLATION
    557 [main] buffer 3004 open_stackdumpfile: Dumping stack trace to buffer.exe
.stackdump
  91591 [main] buffer 3004 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_
VIOLATION
 112417 [main] buffer 3004 _cygtls::handle_exceptions: Error while dumping state
 (probably corrupted stack)


Já colocando menos de 20:
C:\cygwin\bin>buffer.exe
Digite seu nome: Chips
seja bem vindo Chips


"Minha impressora está normal, mas não imprime"

Anonymous

QuoteSegmentation fault

Isto foi o overflow o console ate avisou ...

slul

Quote from: "r1c4rdo1988"
QuoteSegmentation fault

Isto foi o overflow o console ate avisou ...


justamente por isso perguntei por causa do segmation fault mas isso soh acontece qdo passava de uns 40 a 50 chars qdo botava 21 nao estorava =P

Ch1p5

Quote from: "slul"
Quote from: "r1c4rdo1988"
QuoteSegmentation fault

Isto foi o overflow o console ate avisou ...


justamente por isso perguntei por causa do segmation fault mas isso soh acontece qdo passava de uns 40 a 50 chars qdo botava 21 nao estorava =P

isso eh verdade, só estoura de uns 25 acima!


"Minha impressora está normal, mas não imprime"

Anonymous

Gostaria de dizer que "estouro de buffer" nao e um termo correto, pq? pq nao existe estouro algum no buffer que se encontra em um endereco base na memoria, o que acontece e uma sob-escrita, ou seja e escrito bytes acima do limite do buffer dessa forma alcancando areas na memoria que nao pertencem ao buffer.
Usem o termo sob-escrita de buffer, pra simbolizar que ocorre uma escrita acima do buffer.
Enquanto a escrever 21 bytes no buffer de 20 bytes quero dizer que nao exatamente quando voce declara um buffer de 20 bytes sera alocado 20 bytes no buffer, por motivos de alinhamento o compilador pode gerar codigo para alocar mais que isso, o alinhamento seria para com o que haja um acesso optimizado dos bytes na memoria.
Entao por isso se vc escreve no byte 21 do buffer e possivel que vc esteja escrevendo dentro do buffer ainda, para se saber exatamente o tamanho do buffer que foi realmente alocado tem que se saber a quantidade de bytes que e o alinhamento na memoria, e como o compilador gerara as instrucoes de alocacao usando um disassembler.

Anonymous

RET:
é ondereço de retono(return address), ou seja, quando o programa encontra uma chamada outra função o programa ele "salta" para executa a função e depois retorna para a função de origem ao qual fez a chamada.

Nao gostei da explicacao do RET, entao por isso irei dar a minha propia explicacao:

ERET(Endereco de retorno)
E um endereco na memoria para onde o rumo de execucao retorna quando um procedimento(bloco de codigos) e executado(finalizado), o ERET se encontra na stack e colocado quando o procedimento e chamado.