Vault-breaker
Descrição do Desafio:
Autor: w3th4nds Plataforma: Hack The Box Categoria: Pwn Dificuldade: Muito fácil Data: 2022 Descrição:
Money maker, Big Boy Bonnie has a crew of his own to do his dirty jobs. In a tiny little planet a few lightyears away, a custom-made vault has been found by his crew. Something is hidden inside it, can you find out the way it works and bring it to Bonnie?
Passo a Passo da Solução
1. Análise do arquivo fornecido
Como o desafio não fornece o código-fonte, o primeiro passo é executar o programa para vermos seu comportamento normal. Executando-o, percebemos que o programa criptografa alguma coisa, com uma chave de valor desconhecido, e devolve o resultado para nós.
Como isso é insuficiente para determinar o que está acontecendo de fato, devemos analisar o assembly do executável. Olhando pelo Ghidra, podemos identificar duas funções importantes, a new_key_gen()
e a secure_password()
. A primeira é chamada toda vez que a opção 1 for selecionada, e a segunda é chamada quando a opção 2 for selecionada.
Nota: O programa só encerra a execução se qualquer número, com exceção do 1, for digitado.
Analisando as funções, podemos perceber o seguinte:
Podemos chamar a função
new_key_gen()
quantas vezes nós quisermos.A key é gerada através do arquivo
/dev/urandom
, e seu tamanho é determinado pelo usuário.A key é salva na variável
random_key
, que consegue armazenar no máximo 32 caracteres.A flag é criptografada por um xor entre os caracteres dela com os caracteres da key de mesmo índice.
2. Exploit
A solução é bem simples, a key gerada é salva na variável random_key
, que desde o início já possuí um valor aleatório, por meio da função strcpy()
. Essa função, além de copiar o valor da key ela também copia os byte nulo presente no final de toda string.
Com isso, podemos ir zerando o valor da random_key
, começando com uma key de tamanho máximo e indo até o valor 0. Dessa forma, o byte nulo presente no final de cada key gerada é salvo nos índices [31] a [0] da variável.
Importante: A variável deve ser zerada do final até o início, pois se for do início até o final, o byte zerado anteriormente é sobrescrevido por um novo valor de key.
Após zerar a variável, basta selecionar a opção 2, que a flag será mostrada, pois qualquer operação xor entre um valor e 0 é o próprio valor.
Flag
HTB{d4nz4_kudur0r0r0}
Autor da WriteUp
Atualizado