
Neste artigo, aprendemos como interceptar os dados transferidos entre a função de biblioteca e o programa, lembre-se dos descritores de arquivos e resolva as tarefas 6 e 9 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.
A solução para a tarefa aleatória
Clicamos no ícone com a assinatura aleatória e informamos que precisamos conectar via SSH com a senha guest.

Quando conectado, vemos o banner correspondente.

Vamos descobrir quais arquivos estão no servidor e quais direitos temos.
ls -l

Assim, podemos ler o código fonte do programa, pois existe o direito de ler para todos, e executar o programa aleatoriamente com os direitos do proprietário (o bit fixo está definido). Vamos ver o resultado do código.

O programa gera um número aleatório, aplica a operação XOR (OR exclusivo) e, se o resultado da operação XOR for igual ao valor de referência, ele exibe um sinalizador.
O fato é que a função rand () é usada neste programa. Esta função gera um número pseudo-aleatório, convertendo o “grão” gerado pela função srand (). A função srand (número) deve ser chamada todas as vezes antes de chamar rand (). Se isso não acontecer, srand (1) é acionado antes de rand () por padrão.
Assim, neste programa, um gerador de números pseudo-aleatórios converte o mesmo "grão" a cada vez, de acordo com o mesmo algoritmo. Precisamos descobrir o número que a função rand () retorna e proxory com o valor de referência. Como a operação XOR é reversível, passando o valor recebido para a entrada do programa, obtemos um sinalizador.
Vamos interceptar os dados entre a função da biblioteca rand () e nosso programa. Para fazer isso, use o utilitário ltrace.
ltrace ./random

Vemos com quais parâmetros a função rand () é chamada e qual valor ela retorna. Agora proxorit este valor com a referência.

Nós enviamos o número resultante para a entrada do nosso programa.

Passamos a bandeira e obtemos um ponto para uma tarefa tão fácil.

Solução para o erro
Clicamos no ícone com a assinatura de erro e informamos que precisamos conectar via SSH com a senha de convidado.

Quando conectado, vemos o banner correspondente.

Vamos descobrir quais arquivos estão no servidor e quais direitos temos.
ls -l

Assim, podemos ler o código fonte do programa, pois existe o direito de ler para todos, e executar um programa de erro com os direitos do proprietário (o bit fixo está definido). Vamos ver o resultado do código.

No início do programa, um arquivo é aberto e um descritor é criado. Sobre os descritores de arquivos, já escrevi em detalhes neste artigo. Mas o fato é que a condição cometeu um erro. Assim, uma comparação é realizada primeiro, cujo resultado é uma mentira e, em seguida, a atribuição desse resultado falso (ou seja, 0) à variável fd.

Em seguida, a função sleep é chamada e, sem sugerir entrada para a variável pw_buf, os dados são lidos. Porém, devido a um erro na condição, eles não são lidos em um arquivo aberto com uma senha, mas na entrada padrão (identificador 0).
Em seguida, inserimos 10 caracteres, que caracterizam cada caractere com 1 e são comparados com uma senha.

Assim, inserimos duas linhas, cujos caracteres devem resultar em uma operação XOR.Encontraremos dois caracteres, se os proxorizarmos, obteremos 1.

Estes são os caracteres A e @. Agora digite duas linhas no programa, um dos 10 caracteres 'A' e o outro - '@'.

Entregamos a bandeira e conseguimos mais um ponto.

Vejo você nos seguintes artigos!
Estamos em um canal de telegrama: um
canal no telegrama .