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.
Arch: amd64
RELRO: Partial RELRO
Stack: No canary found
NX: NX unknown - GNU_STACK missing
PIE: No PIE (0x400000)
Stack: Executable
RWX: Has RWX segments
SHSTK: Enabled
IBT: Enabled
Stripped: NoA 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