2password
Descrição do Desafio:
Autor: kaiphait Categoria: pwn Descrição:
2Password > 1Password
Arquivos
chall
Executável.
chall.c
Código-fonte.
Dockerfile
Arquivo docker.
ld-linux-x86-64.so.2
Linker da libc
libc.so.6
libc
solve.py
Script em Python que resolve o desafio.
📥 Download: Arquivos
Passo a Passo da Solução
1. Análise dos arquivos fornecidos
Este desafio fornece tanto o executável como o código-fonte dele. Olhando para o código fonte, notamos que é um código simples, ele apenas pede para inserirmos um usuário, uma senha 1, e por fim uma senha 2, sem nenhuma possibilidade de overflow.
Também notamos que a flag não é impressa na tela em nenhum momento, porém, há uma verificação entre o conteúdo dela e a senha 2.
O interessante desse código, é que no final dele, caso uma das verificações de usuário e senha tenha falhado, é impresso o username
por meio da função printf(username)
. E isso é uma vulnerabilidade de format string, porque dessa forma nós podemos inserir formatos na variável do usuário que imprimirão o conteúdo da pilha, e como o conteúdo da flag é carregado para uma variável local antes da verificação, ela estará na pilha.
2. Exploit
A solução é bem simples, devemos encontrar a posição na qual a flag começa a aparecer na pilha e com isso vazar seu conteúdo. Executando o código, e digitando vários caracteres de formato, encontramos a flag na posição 6 da pilha.
Nota: No meu caso, o arquivo flag.txt contém o valor ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA
, por isso que a saída na pilha é um monte de 0x42
e 0x41
.
Nota: O valor 9 na instrução range(6, 9)
foi encontrado depois de vazar a flag pela primeira vez, inicialmente o valor era 11, já que no código-fonte a flag era carregada para uma string de 42 caracteres.
Flag
lactf{hunter2_cfc0xz68}
Autor da WriteUp
Atualizado