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?

parte 1