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.
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.
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.
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.
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:
Acabamos de verificar que este endereço pertence à variável
var.Precisamos agora descobrir qual o valor de
beefpara substituirmos dentro do código, para fazer isso de forma simples basta digitarp 0xbeefdescobrimos assim que convertendo beef para decimal obtemos 48879.Para prepararmos o prompt de envio precisamos analisar algumas informações primeiro:
%n,%hne%hhnocupam 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$hnDigitando isso no console obtemos a tão esperada flag:
Atualizado