Data da postagem: Nov 8, 2019
Tempo de leitura: 1 min

Vai ter um monte de coisas básicas que pularei para ir direto ao assunto. Se você não fizer ideia do que são ataques que exploram format strings, sugiro uma lida nesse velho write-up meu.

O código fonte a ser explorado:

A variável changeme é declarada dentro da struct locals junto com a array de char dest. Se você compilar um programinha e verificar os endereços, vai sacar que changeme acaba ficando abaixo de dest na stack. Depois de imprimir o banner, o programa recebe um input usando fgets, checando o tamanho do input para evitar um overflow, o que causaria a alteração de changeme sem precisar explorar as format strings.

O problema ocorre porque snprintf é usado de forma incorreta, passando o input direto como parâmetro. Assim, se o input conter format strings, elas serão interpretadas como tal.

Logo, a forma mais fácil de causar um overflow em dest e sobreescrever changeme é passar o máximo de %x que couberem, que no caso são 7, e ver os %x serem substituidos por endereços de memória da stack. É o suficiente para ultrapassar os 32 chars, causar um overflow e sobreescrever changeme.

Se quiser ver a ação na prática, põe um breakpoint na chamada de snprintf em main (main+104) e observe os valores na stack antes e depois que snprintf for chamada.

user@phoenix-amd64:/opt/phoenix/amd64$ ./format-zero 
Welcome to phoenix/format-zero, brought to you by https://exploit.education
%x%x%x%x%x%x
Well done, the 'changeme' variable has been changed!

tags: Phoenix Exploit-Education, format strings, exploits,