Solução de problemas com pwnable.kr 03 - bof. Estouro de buffer na pilha

imagem

Neste artigo, analisaremos esse tipo de vulnerabilidade como um estouro de buffer na pilha e resolveremos a terceira tarefa do site pwnable.kr .

Informações Organizacionais
Especialmente para aqueles que desejam aprender algo novo e se desenvolver em qualquer uma das áreas de segurança da informação e da informática, escreverei e falarei sobre as seguintes categorias:

  • PWN;
  • criptografia (criptografia);
  • tecnologias de rede (rede);
  • reverso (engenharia reversa);
  • esteganografia (estegano);
  • pesquisa e exploração de vulnerabilidades na WEB.

Além disso, compartilharei minha experiência em análise forense de computadores, análise de malware e firmware, ataques a redes sem fio e redes locais, realização de protestos e explorações por escrito.

Para que você possa descobrir sobre novos artigos, software e outras informações, criei um canal no Telegram e um grupo para discutir quaisquer questões no campo da CID. Além disso, considerarei pessoalmente seus pedidos, perguntas, sugestões e recomendações pessoais e responderei a todos .

Todas as informações são fornecidas apenas para fins educacionais. O autor deste documento não se responsabiliza por nenhum dano causado a alguém como resultado do uso dos conhecimentos e métodos obtidos como resultado do estudo deste documento.

Estouro de buffer


O estouro de buffer é uma vulnerabilidade em programas de computador com base na capacidade de gravar dados fora do buffer alocado na memória, o que ocorre, em regra, devido ao recebimento e processamento descontrolados de dados externos. O uso da tecnologia de quadro de pilha de alto nível pelas linguagens leva à mistura de dados de controle e dados de programa.

Neste artigo, analisamos apenas o estouro de buffer na pilha. Esse tipo de estouro de buffer é conhecido como esmagamento de pilha e pode ser explorado das seguintes maneiras:

  • substituindo uma variável local localizada na memória perto do buffer;
  • reescreva o endereço de retorno no quadro da pilha;
  • reescrever um ponteiro de função ou manipulador de exceções;
  • sobrescrevendo um parâmetro de outro quadro de pilha.

Esta tarefa usa o método de reescrever uma variável local. Considere sua essência no seguinte exemplo:

#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; } 

Como a variável pass é definida anteriormente, a variável buf , é possível estourá-la. Se você digitar mais de 9 bytes no buf , eles substituirão os dados na variável pass . Assim, é possível "alterar" a senha para si própria, passando o programa, por exemplo, uma linha 11111111 \ x0011111111 \ x00 .

imagem

imagem

Solução do trabalho bof


Clicamos no ícone com a assinatura bof e somos fornecidos com o código fonte, o próprio programa, assim como o endereço e a porta da conexão TCP.

imagem

Vamos dar uma olhada no código fonte.

imagem

Segue-se do código que o programa aceita a string, mas compara a chave já conectada com o valor de controle. Porém, como a entrada não é controlada e a chave é definida antes do nosso buffer, podemos exceder o buffer e substituir a chave. Para isso, é necessário determinar as posições relativas das variáveis ​​na memória.

Vou usar o Cutter para analisar o programa. Abra o Cortador, especifique o caminho para o arquivo executável.

imagem

imagem

imagem

O cortador nos envia imediatamente para o ponto de entrada. Na lista de funções, selecione principal.

imagem

Em geral, vemos uma chamada para nossa função, abra-a clicando duas vezes no nome da função.

imagem

Há um comentário antes do código da função, que reflete as variáveis ​​usadas na função e seus endereços em relação à base do quadro de pilha atual (ebp). Como você pode determinar, nosso buffer é a variável var_2ch e a chave é arg_8h .

imagem

imagem

Calculamos quantos bytes precisamos sobrescrever. Para fazer isso, basta encontrar a diferença entre os endereços.

imagem

Portanto, precisamos enviar ao programa 0x34 quaisquer bytes e, em seguida, adicionar o valor de referência para um exemplo. Por conveniência, eu uso a biblioteca pwntools .

 from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive() 

Pegamos a concha e visualizamos a bandeira.

imagem

Como resultado, obtemos nossos pontos.

imagem

Neste artigo, vimos um exemplo de exploração de um estouro de buffer em uma pilha, conhecendo a ferramenta Cutter e a biblioteca pwntools. No próximo artigo, falaremos sobre empacotar arquivos executáveis ​​e resolveremos a quarta tarefa. Vejo você nos seguintes artigos.

Estamos em um canal de telegrama: um canal no telegrama .

Source: https://habr.com/ru/post/pt459918/


All Articles