// 02 iniciante forçar retorno de função

Patch de
Retorno

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?

~/cracklab/02-patch-retorno
$ ./challenge
Usuario: hacker
=================================
CONTA GRATUITA
=================================
Acesso negado ao conteudo
premium. Faca upgrade!
// conceitos necessários
EAX
Em x86-64, o valor de retorno de uma função (inteiros) é armazenado no registrador eax (ou rax).
MOV
A instrução que move dados. mov $0x0, %eax coloca o valor 0 no registrador.
RET
A instrução de retorno (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.

// solução passo a passo
01
Localiza a função
r2
r2 -A ./challenge
s sym.is_premium_user
pdf
Você vai ver algo assim no final da função:
asm
401196:  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
02
Entende o problema
Em x86-64, o valor de retorno de uma função fica em eax. Antes de retornar, a função faz mov $0x0, %eax. Quem chamou lê esse valor e decide o caminho.
Se você forçar eax = 1 logo antes do ret, a função sempre diz "é premium".
03
O patch
O endereço do mov $0x0, %eax final é 0x4011fe. Você vai sobrescrever por mov $0x1, %eax.
Em bytes: b8 00 00 00 00 muda para b8 01 00 00 00. Só o segundo byte muda!
r2
r2 -w ./challenge
s 0x4011fe
wx b8 01 00 00 00
q
04
Verifica e Roda
bash
$ ./challenge
Usuario: qualquercoisa
=================================
  BEM-VINDO AO CONTEUDO PREMIUM
=================================
Por que funciona: Você não tocou no 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.