delulu

Autor(s): Diego Valim & Murilo Gebra

Analisando o arquivo delulu, disponibilizado na plataforma do HTB, no ghidra, descobrimos um ponteiro(local_40 (renomeada para var_ptr na imagem)) para um variável local_48 (renomeada para ‘var’ na imagem) de valor 0x1337babe.

image

Prosseguindo com a análise do arquivo no ghydra, percebemos a vulnerabilidade que seria explorada: Strings de Formatação. Tal vulnerabilidade pode ser percebida na linha 23 da função main do código decompilado no ghidra. A função printf((char *) &local_38) tem a capacidade de executar comandos armazenados na variável local_38 (renomeada para buffer na imagem), qual recebe o input do usuário. No código podemos ver que após uma verificação da variável var, caso a operação seja bem-sucedida o código inicializa a função delulu.

image

Nessa função, é onde será printada a nossa flag. Seguindo com o exploit do printf, precisamos descobrir onde está armazenada a variável var, através do ponteiro disponível. Desse modo, abrimos o arquivo com gdb: gdb ./delulu já na pasta do arquivo, após isso utilizamos ctrl + c para cancelar a execução direta do programa e entrarmos no debugger do pwndbg.

Após entrar no debugger enviamos si (single instruction) e logo em seguida %p. cerca de 9 vezes, desse modo, fazendo o printf printar variáveis de ponteiro, assim conseguimos achar o endereço onde está alocada a variável var.

image

Depois de enviar, o processo de debugging já terá começado e vamos enviar a instrução n (next) no console até chegar na instrução do printf.

image

Identificando o printf podemos identificar o valor 0x1337babe de var e também seu offset (7 pois é o 7º item do print) que será mais importante depois logo em seguida, possivelmente seu ponteiro, devemos pegar esse possível ponteiro e verificar do seguinte modo:

  1. Acabamos de verificar que este endereço pertence à variável var.

  2. Precisamos agora descobrir qual o valor de beef para substituirmos dentro do código, para fazer isso de forma simples basta digitar p 0xbeef descobrimos assim que convertendo beef para decimal obtemos 48879.

  3. Para prepararmos o prompt de envio precisamos analisar algumas informações primeiro: %n, %hn e %hhn ocupam respectivamente 4, 2 e 1 byte. Agora estamos prontos para fazer o prompt para receber a flag: %48879c – número de casas que o código deve pular para chegar a variável para sobrescrever; 7$ – offset; %hn – precisamos sobrescrever 2 bytes (beef) portanto usaremos %hn;

    Assim obtemos nosso promp para enviar no console: %48879c%7$hn Digitando isso no console obtemos a tão esperada flag:

Atualizado