Pergunta

Como são de estouro de buffer usada para explorar computadores?

Como é um capaz de executar código arbitrário simplesmente causando pilha ou pilha overflows?

Eu entendo que partes da memória de programas são substituídos que não é suposto ser, mas eu não vejo como isso leva a uma execução de seu próprio código. Além disso, deve código malicioso 3º do partido ser escritos nos processadores alvo montagem de linguagem?

Foi útil?

Solução

Este é o documento mais conhecido sobre o assunto: Smashing pilha para o divertimento eo lucro

No entanto, 'pilha estouros' não tem nada a ver com estouros de buffer. estouros de pilha são geralmente apenas um caso de erro no código ruim que não pode ser explorado para qualquer coisa fora de um acidente (DoS).

Edit: Você também perguntou sobre montão transborda. Este é um documento bom sobre o assunto: http://www.w00w00.org/files/ artigos / heaptut.txt

Outras dicas

A pilha contém os dados e endereço de retorno quando você saltar para uma sub-rotina. Se você conseguir colocar um endereço específico na pilha onde o endereço de retorno é, você pode forçar o CPU para saltar para um local de memória particular, aquele em que Y ou colocar o seu próprio código. Isso é para estouros de buffer. Heap transborda é um pouco diferente e mais difícil de explorar.

estouros de pilha são apenas indicação de que você correr para fora do espaço de pilha (que é geralmente mais limitado, especialmente no kernel).

Imagine duas casas na rua. Uma delas é a casa do seu amigo e é casa de seu mal paranóico vizinho três portas para baixo. O vizinho mal paranóico nunca entra ou sai, e seu lugar está trancado.

Agora, seu amigo é como um bom confiando amigo, ele vai deixar você armazenar qualquer coisa em seu lugar, colocando para baixo caixas de um após o outro, a partir de uma parede. Na verdade, ele é um amigo bom que ele vai continuar colocando para baixo caixas de um após o outro, sem verificar para ver se ele de bater na parede, até que vai manter no ar e, finalmente, passar através de duas outras casas na rua e em o mal paranóico casa do vizinho. Mas suas confianças amigo que você não vai fazer isso porque ele gosta de você (e ele é um pouco ingênuo).

Então você tem a oportunidade de colocar algo na casa paranóico do vizinho mal, explorando o seu bom confiando amigo.


Substitua os seguintes termos e você verá a analogia a um ataque de buffer overflow:

  • "casa do seu amigo" -> "uma parte de um programa que não verificar a existência de estouro de buffer"
  • "casa de seu mal paranóico do vizinho" -> "outra parte de um programa que é suposto ser seguro"
  • "caixas" -> "Argumentos / parâmetros para o programa que não verificar a existência de estouro de buffer"

Este é bem sucedida se alguém descobrir onde a área segura de memória é, eo que teria de ser passado como um argumento para o programa em questão, que iria acabar na área de segurança, para ter o efeito desejado. (Quer se trate de dados ou código que faz com que o código do explorador a ser executado)

Praticamente todos os processadores modernos ao chamar uma sub-rotina, empurra o endereço de retorno na mesma área que os dados locais (pilha). Para rotinas que não verifica o limite superior de uma variável (em particular, a função strcpy), redirecionamento de endereço de instrução (buffer overflow) pode ocorrer.

void make(char *me)
{
    char sandwich[4]; // local data, this is in stack.  the buffer for data is too small
    strcpy(sandwich, me);
    puts(sandwich);

    // implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address
}

void main()
{
    // calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction's address(getchar line) on stack before jumping to make.
    make("Love Not War"); 
    getchar();

    puts("This will not execute.  The address to next instruction(getchar) gets overwritten with Not War");

}

"Além disso, deve código malicioso 3º do partido ser escritos nos processadores alvo montagem língua?" Sim

estouro de pilha pode ocorrer a partir normalmente execução do programa, o exemplo é rotinas recursivas (função que chama a si mesmo) com esquecido terminando condição. A área de pilha vai ser preenchido com inúmeras variáveis ??locais na pilha mais os endereços de retorno.

A abordagem normal é que você tem um lugar na memória do código malicioso. Em seguida, você cria um buffer overflow: a magia aqui não é fazê-lo apenas estouro, mas como você já mencionado, que certas partes da memória do programa obter substituído. Como a pilha contém não apenas as variáveis, mas também quando uma função é chamado o endereço de retorno, tenta-se substituir este com o endereço de vocês código malicioso. Quando a função com as Buffer overflow retorna ao seu chamador, a função não retornar ao seu chamador original, mas em vez disso, a sub-rotina malicioso. Como o código agora executado tem usally os privilégios do código de chamada, tenta-se encontrar / criar este transborda em código que tem permissão maior do que o código mal (mais você poderia fazê-lo diretamente chamando a rotina mal).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top