Baby PWN
Descrição do Desafio
Categoria: pwn Descrição:
I hope you are having a nice day.
Arquivos
main
Executável.
solve.py
Script da solução.
📥 Download: Arquivos
Passo a Passo da Solução
1. Análise do executável
Olhando para o código do executável pelo Ghidra, notamos que ele é bem simples. Ele apenas chama uma função vuln()
que por sua vez, chama a gets()
.
Aqui já sabemos que o executável é vulnarável a buffer overflow, já que a gets()
não limita e entrada de caracteres. Porém, a vulnerabilidade principal está na falta da proteção NX
.
A proteção NX
é a responsável por fazer com que os dados na pilha não possam ser executados, porém sem ela, podemos inserir shellcodes no buffer e por fim retornar para eles, fazendo eles serem executados.
2. Exploit
Já sabemos que devemos escrever shellcodes, porém não sabemos como retornar para eles, pois a área da pilha é influenciada pelo ASLR
e não pelo PIE
, e como ele dificilmente estará desativado, a pilha estará com os endereços randomizados.
É aí, que surge a instrução call rax
, identificada pelo comando ROPgadget --binary=main
. Essa instrução é importante porque sabemos o endereço, que não é aleatório, e principalmente, porque o rax
armazena um ponteiro para o buffer após a função gets()
ser executada. Com isso a solução está praticamente pronta, falta descobrir quantos bytes escrever até o endereço de retorno.
Endereço de retorno está armazenado no endereço 0x7fffffffded8
e o buffer começa no endereço 0x7fffffffde60
, logo a quantidade de bytes para chegar no retorno é 120.
Importante: O shellcode foi reutilizado do desafio Execute, por isso ele não está otimizado.
Flag
BITSCTF{w3lc0m3_70_7h3_w0rld_0f_b1n4ry_3xpl01t4t10n_ec5d9205}
Autor da WriteUp
Atualizado