Tutoriais
ENTENDENDO BUFFER OVERFLOW PARTE 2 By ThorKing
enho avisar antes de mais nada que essa parte é a mais complicada tem que ter atenção redobrada pra aprender então feche o seu orkut e msn e leia com atenção pois quem estuda programação essa parte vai ser muito útil, sendo que esse texto abaixo Foi retirado de uns sites e adaptado da melhor maneira possível sendo que ficará mais fácil depois que eu colocar uns desenhos de como funciona a fila.
Para entender melhor sobre buffer overflow é necessário entender como os programas funcionam , falaremos sobre particularidades de programas e o uso da memória, poderão obter maiores informações no link abaixo:
http://www.google.com.br/search?hl=pt-BR&q=particularidade+de+programas&btnG=Pesquisar&meta=
http://www.google.com.br/search?hl=pt-BR&q=manipula%C3%A7%C3%A3o+de+mem%C3%B3ria&meta=
http://www.google.com.br/search?hl=pt-BR&q=filas+e+pilhas&meta=
Um programa quando é executado , possui algumas particularidades, e dentre elas, destaca-se um artifício usado na computação que diz o seguinte: logo após o termino da execução desse mesmo programa,o sistema retorna ao estado que se necotrava aontes.O nome dado a esse artificio é “retorno”. Mas pra isso acontecer é necessário alguns procedimentos.
• Salver endereço na memória referente ao retorno
no stack pointer;
•
Verificar-se há execução normal do programa.
•
Caso a execução termine normalmente, a CPU pula para
o endereço de retorno previamente salvo;tudo continua normalmente.
OBS: Porém,se devido a motivos anômalos, que podem ser, por exemplo, acontecimentos de buffer overflow, a memória é sobrescrita e o endereço de retorno é modificado,e o programa pode retornar lugares desconhecidos da memória e seu término fica indefinido e indeterminado.
Para saber sobre stack pointer acesse o link abaixo:
http://www.google.com.br/search?hl=pt-BR&q=stack+pointer&meta=
ENTENDENDO O USO DA MEMÓRIA
Não tem como definir num todo o modelo usual da memória pois difere de sistema pra sistema,vou descrever para Linux/i86 pois os textos que li na net falam mais pra Linux e na minha faculdade a parte de programação e estrutura de dados é voltada pra linux então... hehe mas a diferença pelo que eu pesquisei é pouca .
No Linux/i186 a memória possui o modelo flat de 32 bits.Um programa pode ser dividido me seções:
* .text: fixada pelo programa e inclui as instruções propriamente ditas e aos dados somente-leitura.Esta região corresponde ao segmento de texto do binário executável e é normalmente marcada como somente leitura para que qualquer tentativa de escrevê-la resulte em violação de segmentação;
• .data: contém as variáveis globais e estáticas
do programa;
•
.bss: para dados indefinidos.
Podemos visualizar da seguinte maneira:
fico devendo uma imagem
Já na linguagem C vamos visualiza de outra forma
fico devendo uma imagem
A região mais importante na qual devemos prestar atenção é a região do Stack pois é nela que os crackers exploram para causar o buffer overflow.
Vou tentar definir depois de consultar dezenas de sites o que vem
a ser Stack.
Stack ou pilha é um bloco de memória contíguo
e armazenar valores de retorno delas. Seria interessante ou antes ou
depois de ler esse texto vocês buscassem no google por assembler.
O endereço de base da pilha é fixo e o acesso é realizado
por meios de instruções PUSH e POP, que são implementadas
pelo processador. O registrador é chamado de “ponteiro
de pilha” (SP), que aponta para o topo da pilha.
Esta pilha consiste em uma seqüência de frames que são
colocados no topo quando uma função é chamada,
eretirados ao final da execução.um frame contém
os parâmetros para a função, suas variáveis
locais, e os dados necessários para recuperar o frame anterior,
incluindo o valor do ponteiro de instrução no momento
da chamada de função.
Dependendo da implementação, a pilha deve crescer em
direção aos endereços altos ou baixos.O ponteiro
de pilha também é de implementação dependente,podendo
apontar para o ultimo endereço ocupado na pilha ou para o próximo
endereço livre.
Alem de um ponteiro de pilha , também é importante contar
com um “ponteiro de frame”(FP) que aponta para um endereço
fico no frame.A principio, variáveis locais podem ser referenciadas
fornecendo-se seus deslocamentos em relação ao ponteiro
de pilha.Entretanto,quando palavras são inseridas e retiradas
da pilha,estes deslocamentos mudam.Apesar do compilador poder corrigir
os deslocamentos observando o numero de palavras na pilha,isso é bastante
complicado.O acesso a variáveis locais a distância conhecidas
do ponteiro da pilha também irá requerer múltiplas
instruções.Dessa forma muitos compiladores utilizam um
segundo registrador que aponta para o topo da pilha no inicio da execução
da função,para referenciar tanto variáveis locais
como parâmetros, já que suas distâncias não
se alteram em relação a esse endereço cm chamadas
PUSH e POP .Na arquitetura Intel x86, o registrador EBP é usado
para esse propósito. Por causa da disciplina de crescimento
da pilha, parâmetros reais tem deslocamentos positivos e variáveis
locais têm deslocamento positivos a partir de FP.
A primeira instrução que o procedimento deve executar
quando chamado é salvar o FP anterior, para que possa ser restaurado
ao fim da execução. A função copia então
o registrador de ponteiro de pilha para FP para criar o novo ponteiro
de frame e ajusta o ponteiro de pilha para reservar espaço para
as variáveis locais .Este código é chamado de
prólogo da função.Ao fim da execução
, a pilha deve ser restaurada e a execução deve retornar
na instrução seguinte à de chamada da função,
o que chamaremos de epílogo . As instruções CALL,LEAVE,
e RET nas máquinas Intel são fornecidas para parte do
prólogo e epílogo em chamadas de função.A
instrução CALL salva na pilha o endereço da instrução
seguinte como endereço de retorno da função chamada.A
instrução RET deve ser chamada dentro do procedimento
e restaurada a execução no endereço que está no
topo da pilha.
definição de stack escrita por Thiago nogueira.
vou explicar como funciona melhor os ponteiros atraves de imagens mas é complicado desenhar então esperem um pouquinho ok?