> For the complete documentation index, see [llms.txt](https://stacked-rwx.gitbook.io/public/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stacked-rwx.gitbook.io/public/reverse-engineering/chall3.exe-resolvendo-desafio-de-engenharia-reversa.md).

# Chall3.exe - Resolvendo desafio de Engenharia Reversa

Bom, vamos lá! Os créditos vão para:\
Instagram: <https://www.instagram.com/untw0/>\
LinkedIn: <https://www.linkedin.com/in/maiquel-paiva/>

Quando executamos o programa, automaticamente ele pede uma senha.

<figure><img src="/files/MXYP3BB6zh4WO3TM0k9q" alt=""><figcaption></figcaption></figure>

Nessa hora eu pensei em algumas possibilidades. Ou a senha está armazenada em alguma variável do programa ou ela vai ser gerada de alguma forma muito aleatória.

Resolvi analisar o programa usando o ghidra.

<figure><img src="/files/n9ggTN4KHIxfaG8LA9v6" alt=""><figcaption></figcaption></figure>

Analisando a função main, pude observar como ela funciona. Primeiro, observei a uma outra função chamada "verifiy" e olhando como é seu funcionamento, ficou claro como o programa funcionava.

<figure><img src="/files/vrAJQDVhgziu73EERK9D" alt=""><figcaption></figcaption></figure>

Analisando a função "verify", posso encontrar algumas coisas bem interessante. Primeiro ponto:

```c
int iVar1 = strlen(param_1);
if(iVar1 == 10) {}
```

A senha precisa ter EXATAMENTE 10 caracteres.

Depois dessa parte, podemos observar o loop de verificação.

<figure><img src="/files/5wimrKIYEqlY1RdUjbi6" alt=""><figcaption></figcaption></figure>

Em alguns minutos, entendi como funcionava. Para cada caractere da senha, multiplica o índice por 9 e depois faz XOR com o caractere correspondente da senha, subtrai 5 e soma isso ao acumulador local\_10.

No fim, local\_10 precisa ser exatamente igual a 0x3A9, que é 937 em decimal.

Nesse contexto todo, sabemos que nossa flag está protegida por XOR encryption. Então vamos preparar nosso script e encontrar a senha.

<figure><img src="/files/Z8rLQz5gCdNwyGBXqqsf" alt=""><figcaption></figcaption></figure>

Levei uns 25 minutos para codar todo o script com muitos erros mas até que consegui finalizá-lo e o resultado foi o seguinte:

<figure><img src="/files/1hNwbCp2by7pJlm4PWeJ" alt=""><figcaption></figcaption></figure>

Perfeito! Temos então a nossa flag mas ela está em hexadecimal. Mas lembra que eu mencionei sobre o XOR encryption? Então... a senha que foi encontrada é a mesma senha usada para decriptar esse hex. Então vamos fazer isso!

<figure><img src="/files/6MzIiwpVNMAr4tSKlYi5" alt=""><figcaption></figcaption></figure>

Então...

<figure><img src="/files/KPtfzk819bZXcIOpSFLt" alt=""><figcaption></figcaption></figure>

Temos a flag! Pimba.

Mas sabe algo curioso? Lembram quando fiz-me o seguinte questionamento: onde a flag pode estar armazenada?

Bem... vejam!

<figure><img src="/files/TpxE18AguggOML9Afuxp" alt=""><figcaption></figcaption></figure>

Ela está armazenada na stack, antes do loop iniciar. Então ela já estava ali, porém era necessário usar a senha para decriptar a flag.

Enfim, esse é mais um challenge que eu resolvo e feito por um amigo :)

Espero vocês nos próximos capítulos!

\~ pkill -9 -t nct
