Interns' Project
Descrição do Desafio:
Categoria: pwn Descrição:
Our interns put together a little test program for us. It seems they all might have patched together their separate projects. Could you test it out for me?
Arquivos
internsProject
Executável.
📥 Download: Arquivos
Passo a Passo da Solução
1. Análise do arquivo fornecido
Este desafio fornece apenas o executável, que é bem simples. Ao executá-lo, ele entra em um loop que pede para digitarmos um número de 1 a 3, cada um correspondendo a uma operação diferente:
Welcome to our intern's test project!
The following are your options:
1. Say hi
2. Print the flag
3. Create an account
Enter option (1-3). Press Enter to submit:
1
Hi!
The following are your options:
1. Say hi
2. Print the flag
3. Create an account
Enter option (1-3). Press Enter to submit:
2
Error: Option 2 requires root privileges HAHA
The following are your options:
1. Say hi
2. Print the flag
3. Create an account
Enter option (1-3). Press Enter to submit:A opção 2 parece ser o objetivo do desafio, mas quando a selecionamos, o programa informa que não temos permissão. A partir daí, partimos para a análise do código utilizando o Ghidra.
A função main() pode ser vista acima, e basicamente confirma o que já observamos no terminal: um loop que exibe o menu e pede uma entrada de 1 a 3. O destaque vai para a função handleOption(), que provavelmente é responsável por lidar com essa entrada do usuário.
O código acima mostra como a função handleOption() funciona. Ela lê o que foi digitado no terminal e salva os valores no vetor local_428. Um detalhe importante é que ela lê a linha inteira e salva todos os números digitados (desde que estejam separados por espaço), tratando todos eles um por um.
A parte mais curiosa é a verificação de permissão para a opção 2:
Ou seja, ela só verifica se a primeira opção digitada foi 2 e se o usuário não é root. Se isso for verdade, ela impede o acesso e mostra a mensagem de erro. Porém, se digitarmos qualquer outro número primeiro, e colocarmos o 2 depois, a função printFlag() será executada normalmente, pois o restante do vetor não passa pela verificação de privilégio.
2. Exploit
Seguindo o que foi visto acima, basta digitarmos qualquer opção antes da opção 2 para que ela seja executada, revelando assim a flag.
Flag
DawgCTF{B@d_P3rm1ssi0ns}
Autor da WriteUp
Atualizado