Qualquer usuário. Qualquer senha. Não importa. Ensine a função a mentir o resultado.
Você encontrou um player de cursos online. Tem conteúdo premium. Tem conteúdo gratuito.
E tem uma função que decide qual você merece ver.
O binário chama uma função pra decidir se você é premium ou não.
Essa função retorna 1 (premium) ou 0 (não premium).
Tudo depende do que ela retorna. E se ela sempre retornasse 1?
eax (ou rax).mov $0x0, %eax coloca o valor 0 no registrador.C3). Volta para quem chamou a função, carregando o valor que está em eax.
Antes de ler a solução, tenta responder: Como uma função comunica seu resultado pra quem a chamou?
Pensa nisso. Abre o disassembly. Procura a função is_premium_user. Olha as últimas instruções antes do ret.
r2 -A ./challenge
s sym.is_premium_user
pdf401196: is_premium_user: ... 4011fe: b8 00 00 00 00 mov $0x0,%eax ; return 0 ← caminho de "não premium" 401203: c9 leave 401204: c3 ret ; (dentro do loop, quando encontra match:) 4011ed: b8 01 00 00 00 mov $0x1,%eax ; return 1 ← só chega aqui com usuário válido 4011f2: eb 0f jmp 401203
eax.
Antes de retornar, a função faz mov $0x0, %eax. Quem chamou lê esse valor e decide o caminho.eax = 1 logo antes do ret, a função sempre diz "é premium".
mov $0x0, %eax final é 0x4011fe. Você vai sobrescrever por mov $0x1, %eax.b8 00 00 00 00 muda para b8 01 00 00 00. Só o segundo byte muda!
r2 -w ./challenge
s 0x4011fe
wx b8 01 00 00 00
q$ ./challenge Usuario: qualquercoisa ================================= BEM-VINDO AO CONTEUDO PREMIUM =================================
main. Não tocou no loop. Não precisou entender o algoritmo. Só ensinou a função a mentir sobre o resultado alterando o que é carregado em eax antes do retorno.