Ir para conteúdo

Crackme 01 - Linux - Geyslan


Fernando Mercês

Posts Recomendados

Fala galera,

Hoje eu achei um fonte de um crackme de 2013 dum brother chamado Geyslan e recompilei. Dá pra aplicar 2 níveis nele:

  1. Patch
  2. Senha válida
/*

  Crackme 01 - C Language - Linux/x86 and x86_64
  Copyright (C) 2013 - Geyslan G. Bem, Hacking bits

    http://hackingbits.com
    geyslan@gmail.com

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by

Bom pra treinar ER no Linux! Quem topa?

Lembrando que há este artigo que mostra algumas ferramentas pra ER no Linux:

 

Além disso, há outras como radare2peda e gef.

Boa sorte!

crackme01-geyslan

Link para o comentário
Compartilhar em outros sites

Falai, Fernando!

Bacana esse crackme. Eu não sou super user de Linux, então tive alguns problemas no início, pq esqueci que eu estava rodando um x86_64 e tava sem a libc pra x86.
Fiquei achando que fazia parte do desafio hahaha Perdi um tempinho ali! hahaha

Eu tinha mexido pouco no radare2, aconselho muito a usarem. Depois que pega o jeitão vai embora. O Visual mode dos caras ta muito poderoso! Vale a pena dar uma conferida! Fica a dica.

Bom, vou deixar 2 binários. Um que ta patched pra abrir no GDB e debugar a vontade. E outro ta patched com o resultado final.

E a senha:

Spoiler

whyn0t

 

Link para o comentário
Compartilhar em outros sites

Em 21/10/2017 em 13:26, Fernando Mercês disse:

É verdade @Pimptech, o r2 é encapetado! rs Na época que o Geyslan lançou esse crackme eu fiz com o próprio gdb. Tu tem as manhas de mostrar como fez pra galera aprender? :-) A propósito, parabéns!!!

Claro! Com maior prazer! No gdb deve ser puxado hein.. Sem uma interface amigável! LOL! Esse é monstro! hahah
Sigo teu blog desde da dark era do BLOG. Só coisa boa. Chegamos a trocar alguns e-mails, mas acho que n lembra haha.. Seu BLOG foi uma das portas de entrada em ER p mim. Até montei um blog de er, mas acabei fechando. Anyway, é noiz!! :)

HOWTO

Desculpem qualquer erro de PTBR hahaha :)

Bom galera, vou estender um pouco somente no início pq eu acho mais importante deixar claro como desabilitar a checagem do GDB. O resto eu vou passar mais rápido, mas essa parte é mais essencial até pra você poder sondar melhor o crackme.

Primeiramente instale o radare2. Tudo que vocês precisam para instalar o radare2 está no link abaixo:

Caso tenham algum problema em instalar, deixa um post ai que se eu puder ajudar, eu ajudo :).

Para abrir o crackme no radare2 (r2) é bem simples:

Spoiler

1.jpg.46ff206448a03e57a2ccea04f9939857.jpg

-A: Analyze. Ele já vai abrir com o binário analizado. Você também pode utilizar o comando aaaa.
-d: Vai abrir em modo debugger.
-w: Abre em modo de escrita. Ou seja, você pode usar w? para ver os comandos para escrever direto no binario. E também quando "patchar" algo ele ap´licar no binário "físico", pois do contrário ele só aplica no binário in-memory. Poderia ser -Adw

Bom, aqui você pode usar o comando ie pra achar o entry point que é a function entry0 e dar o comando s entry0 pro r2 te levar direto na function. O radare2 ele tem uma curva de aprendizado meio "tensa", pq até você entender todos os comandos e etc, leva um tempo. Você pode usar para listar os comandos e usar o junto com algum comando para ter o help de determinado comando, por exemplo, a?, af?, afl? e assim por diante.

afl: Esse comando vai listar todas as functions que ele conseguiu identificar após a análise (-A). 
ii: Vai listar todos os imports.

Spoiler

2.jpg.0ab105681e25a8c0171a3eb42e428ad1.jpg

Outra forma de achar o início seria achando a função que inicia o processo. Com o comando ii você achar os imports e com eles você é capaz de achar a function:

Essa function prepara o sistema para rodar o programa em si. Notem nessa especificação que ela receber como primeiro argumento int *(main) e se você usar o comando s entry0 você vai notar que o endereço da main é pushado na stack assim como outros valores também. Contudo antes de ir definitivamente para a main essa function passa por outra function apontada pelo parâmetro void (*init). Que nesse caso se você analisar no entry0 acaba sendo a sym.__libc_csu_init. Abaixo uma imagem para ilustrar como se chega na entry0 pelo comando ii.

Spoiler

3.jpg.96b4254618fe63c520fc1d9fd1375704.jpg

Bom, agora sabemos como iniciar o debugging. Se você simplemente abrir o crackme e usar o comando dc que seria o continue para rodar o programa ele já apresenta a mensagem que não é possível rodar dentro do GDB. Então precisamos desabilitar essa detecção. E para isso precisamos saber de onde o GDB é chamado:

Spoiler

4.jpg.4797e26a137db39e9bd51c6ddbf8e9a2.jpg

Dentro da function _init você pode observar primeiro um endereço dinâmico e um loop que o radare2 já mostro pra gente. Se você debugar aqui vai ver que a mensagem do GDB acontece depois dessa call em detaque. Copie o endereço apontado pela call 0x080487ab no meu caso e adicione um breakpoint nessa linha. db 0x080487ab. você pode usar o comando d? para ver a possibilidade que a ferramenta te dá na hora do debugging. Se você fez alguma mudança ou já passou desse ponto, o comando ood é útil para que você possa reabrir o arquivo em modo de debugging. Ok, tudo pronto e breakpoint colocado e só dar o comando dc

Após para a execução nesse ponto vamos usar um pouco o Visual mode. Para entrar nesse modo visual use o comando (maiúsculo) quando você entrar no modo visual ele te dá VÁRIOS modos visuais de navegar pelo binário, gaste um tempo navegando por ele. Para saber como navegar use pressione o para entrar no help do modo visual. Ok vamos la, pressione p para correr para o modo de disassembly e então pressione você irá entrar em um modo parecido (lembra de alguma forma) com o debugging do OllyDbg/x64dbg. Com o breakpoint na linha da call vamos ver onde essa call nos leva. Se você pressionar a tecla você poderá executar comandos como se estivesse na parte não visual do radare2. E nesse ponto vamos utilizar o pxw que seria a impressão hex em formato DWORD de um determinado endereço.

Spoiler

5.jpg.dea59e7cf66264bd215cad24411fcf48.jpg

 

6.jpg.0f7baba3cc2574da5d14be9edf506777.jpg

Podemos ver que somente ebx tem valor, ou seja edi*4 dá 0, então podemos imprimir diretamente pxw @ ebx-0xfc lembrando que o @ é utilizado para representar um endereço. Se você usar simplesmente pxw ele vai mostrar os valores onde seu ponteiro está, no caso poderia ser utilizado após um s, por exemplo.

Bom, voltando as imagens vemos que existe 3 endereços na memória (array) de ponteiros e eles estão em vermelho o que indica que são funções. Você pode, mesmo com o programa parado no breakpoint, usar o comando em cada uma dessas functions seguido do comando pdf que printa o disassembly da function apontada pelo e verá que a function do endereço 0x080485ab é a function sym.detect_gdb. SHOW! E agora ?

Agora vamos assemblar para não executar ela, na minha opinião o jeito MAIS fácil é apenas sair dela quando o programa entrar nela. Para isso eu fiz o seguinte.

Spoiler

7.jpg.eb47197dd70fed9921f3b8ac656d7f95.jpg

8.jpg.f2974b0a2b82948a07927f45a28670aa.jpg

A forma mais fácil para sair dela é usar ela contra ela mesmo. Então vamos usar a instrução JMP essa instrução é muito simples vai simplesmente fazer o ponteiro de execução pular para o endereço que está na contido na instrução. Eu pulei para a instrução leave que fica no endereço 0x08048632, contudo para fazer isso primeiro vamos dar uma olhada na sua referência:

Atentem para "Releases the stack frame set up by an earlier ENTER instruction.". Ou seja o stack frame tem que estar setado já e para setar um stack frame são as primeiras instruções até o 0x080485b1 nesse ponto o stack frame tá setado. Então vamos assemblar aqui. No ponto da imagem eu sai do modo visual pressionando q, ok ? :)

Em modo visual pressione e use o comando s 0x080485b1 e em seguida para sair dos comandos no modo visual. Nesse ponto o radare2 deve ter te levado exatamente para esse endereço, agora você só precisa pressionar (maiúsculo) para entrar no modo de edição do assembly. Digite jmp 0x08048632 e pressione Enter 2 vezes. Pronto! Assemblado. Você pode entrar em modo de -Aw e fazer exatamente isso novamente que quando você entrar no modo -Ad de novo você já vai ter gravado essa instrução direto no binário, sem precisar fazer isso toda hora.

Bom, agora vamos para a parte da senha. A partir desse ponto vou considerar que você já tá mais esperto com o radare2 e seus comandos. Vou fazer um recap do que eu vou usar e só vou descrever o comando, ok ?

Recap:

Spoiler
  • V
    • Entra em modo de visual
  • s
    • seek. radare2 te leva para o endereço informado.
  • pdf
    • printa o disassembly de determinada function.
  • afvn
    • altera os metadados do disassembly. essa função em específico renomeia nomes de variáveis e argumentos.
  • (visual) ?
    • Help do visual. q para sair.
  • (visual) !
    • Modo parecido com Olly.. Para entrar e sair.
  • (visual) :
    • comandos normais em modo visual
  • (visual) Space
    • Modo de "flow". Divididos em branchs igual no IDA.
  • (visual) c
    • Modo cursor para navegar no disassembly. Use as setas para navegar.
  • (visual) s
    • Para debugar. Step into.
  • (visual) S
    • Para debugar. Step over.
  • (visual) F2
    • Para debugar. Seta breakpoint.

Vamos lá. Agora já podemos debugar a main. Mande o ponteiro para main e entre em modo visual. No modo visual pressione espaço para entrar no modo de branchs. Analise ela por um estante e você irá perceber (se você programa qualquer coisa) pelas calls e pelo o que o radare já analisou pra gente o que é feito. Vemos então a string que é printada pedindo o password, depois a função para pegar os valores digitados e logo em seguida a chamada em uma função sym.xor nome bastante sugestivo.

Spoiler

10.jpg.03039e925619401969df3b985d438abe.jpg

Você pode usar o modo de cursor no visual para ir até essa call e pressionar Enter que você vai direto para ela. Ou pode usar os comandos normais como s. Bom, lá dentro da function do XOR eu printei ela para analisar:

Spoiler

11.jpg.befb755c6f697cc57c5c9f49e697525c.jpg

Vamos aos indicativos. Ponteiro/argumento para a o password digitado. Indicativo de loop. Mov 0, indicativo de index de loop. Indico fortemente que você gaste um tempo debugando essa parte e entendo exatamente o que ela faz (use o visual mode com o modo olly, fica muito fácil debugar), assim vai melhorando a habilidade de ler assembly sem ter que ficar debugando toda hora. Basicamente ele move o ponteiro para o registrador e vai xoreando byte a byte o password e logo em seguida na main ele compara esse valor xoreado com o valor que já está xoreado em mem´ória.

Spoiler

13.jpg.661e169c68cbcb8514bc001b76466e34.jpg

O valor já xoreado já está indicado no disasembly obj.passwd. Você pode usar o comando s para seguir até esse ponto em memória para ver o verdadeiro valor do password, lembrando que esse valor já está xoreado. Então faremos o inverso do xor que é o próprio xor.

Spoiler

14.jpg.f4ee8acae9a08b47d7dc7ae7bd09773b.jpg

Para isso usamos o comando wox que vai sobreescrever em memória determinado valor xoreando ele com a key que você indicar. Nesse caso usei a key 0x6c. Agora você pode usar q para sair do visual, q no r2 e executar o crackme com a senha. Para patchar e fazer funcionar com qualquer senha, use como exemplo a parte do detect_gdb. Certo ? Qualquer dúvida é só falar.

Bom galera, é isso. Espero que eu tenha conseguido passar certinho como fazer para reversar esse crackme. Qualquer coisa só falar ai. Abraço!

9.jpg

12.jpg

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...