Ir para conteúdo

Hakuoo

Membros
  • Postagens

    11
  • Registro em

  • Última visita

  • Dias Ganhos

    6

Posts postados por Hakuoo

  1. Olá, confrades, tudo certo?

    Espero que todo mundo esteja bem!

    Eu criei mais um desafio divertido para nossa comunidade, dessa vez com algumas características únicas.


    Bom antes de prosseguir tenho algumas advertências para quem for tentar:

    • Use uma VM(Não use seu computador físico de maneira alguma)!
    • Você pode se assustar com algumas técnicas empregadas(mas garanto não tem nada de malicioso).

    Como regras do nosso desafio:

    1. Se o unpack for feito(Criar um passo a passo de como você fez).
    2. Se a chave for encontrada(Postar como você chegou a essa conclusão)
    3. Você é livre para "bypassar" minhas técnicas empregadas, e se fizer, também faça um tutorial de como conseguiu.

    Não está familiarizado com os termos de challenges? Clique aqui para ler a explicação.


    Sobre o nosso desafio:

    • "Protegido" com Rika's Packer 1.0(Hakuoo Packer)
    • Visual C++ 2019
    • IA-32
       

    Dica:

    • Não tente fazer bruteforce, você pode conseguir se prestar bem atenção nas instruções.
    • Senha para o arquivo: desafiomb
    • Uso na linha de comando: CrackmeV3_challenge.exe senha

    Como mencionado o objetivo é para estudos aperfeiçoamento e aprendizado, todo mundo vai sair ganhando, o desafio é dado como ganho para a melhor resposta ou para quem fazer um unpack funcional, encontrar o OEP, corrigir a IAT, e encontrar a senha.


    Boa Sorte, diversão e Saudações !

    CrackmeV3_challenge.zip

  2. Em 30/09/2018 em 05:35, Fernando Mercês disse:

    Não é exatamente um desafio, mas este pequeno programa foi usado para exemplificar o assunto de strings ofuscadas na aula 23 do CERO e queria postá-lo aqui.

    O lance é entender por que a string não aparece na análise estática. Bem básico, mas é a proposta do CERO mesmo. ?

    cade.exe

    Olá criador do desafio,

     

    Vamos a nossa analise:


    1º Parte

    	Quando encontramos o EntryPoint a parte que mais chama a atenção é a seguinte:
        
            mov     dword ptr [esp+1Ch], 6A645B63h       ; Char 1   
    	mov     dword ptr [esp+20h], 645F585Bh       ; Char 2
    	mov     dword ptr [esp+24h], 575F6857h       ; Char 3
    	mov     dword ptr [esp+28h], 63655924h       ; Char 4
    	mov     dword ptr [esp+2Ch], 685824h         ; Char 5
    
    Nesse caso temos alguns valores sendo movidos para algumas posições da memória indicadas por 
    ESP +offset, e colados lá, isso é caracteristica de um array, ou da instrução strcpy.


    2º Vamos organizar isso e tentar encaixar na instrução do strcpy, ficará da seguinte forma:
     

    int main(int argc, char** argv) {
    	char buffer[20];
    	/*
    	mov     dword ptr [esp+1Ch], 6A645B63h       ; Char 1   
    	mov     dword ptr [esp+20h], 645F585Bh       ; Char 2
    	mov     dword ptr [esp+24h], 575F6857h       ; Char 3
    	mov     dword ptr [esp+28h], 63655924h       ; Char 4
    	mov     dword ptr [esp+2Ch], 685824h         ; Char 5
    	
    	
    	ESP[0] =  6A645B63h;
    	ESP[1] = 645F585Bh;
    	ESP[2] = 575F6857h;
    	ESP[3] = 63655924h;
    	ESP[4] = 685824h;
    	
    	Simplificando:
    	strcpy(ESP, "c[dj[X_dWh_W$Yec$Xh")
    	*/
    	strcpy(buffer, "c[dj[X_dWh_W$Yec$Xh");
    }

    Interessante temos um buffer sendo alimentado por uma string aparentemente ofuscada e convertida do hexadecimal para o ASCII.


    3º Vamos entender mais um pouco de como é feito essa chamada

    lea     eax, [esp+1Ch]  ; copia o endereço de uma posição para EAX
    mov     [esp], eax         ; move o conteúdo do endereço pego para ESP
    call    DecriptStr          ; chama uma call para um função
    mov     [esp], eax         ; retorno da call
    
    ! Todas calls costumam retornam em EAX
    
    nosso peseudocódigo ficará da seguinte forma:
    
    DecriptStr([ESP]);

    Legal, temos um ponteiro de um char sendo movido para uma função ? sim.
    Veja a reescrita disso com as informações que já temos:

    int main(int argc, char** argv) {
    
      // Nova adição, para receber o retorno de EAX
       const char* escrever;
    
    	char buffer[20];
    	/*
    	mov     dword ptr [esp+1Ch], 6A645B63h       ; Char 1   
    	mov     dword ptr [esp+20h], 645F585Bh       ; Char 2
    	mov     dword ptr [esp+24h], 575F6857h       ; Char 3
    	mov     dword ptr [esp+28h], 63655924h       ; Char 4
    	mov     dword ptr [esp+2Ch], 685824h         ; Char 5
    	
    	
    	ESP[0] =  6A645B63h;
    	ESP[1] = 645F585Bh;
    	ESP[2] = 575F6857h;
    	ESP[3] = 63655924h;
    	ESP[4] = 685824h;
    	
    	Simplificando:
    	strcpy(ESP, "c[dj[X_dWh_W$Yec$Xh")
    	*/
    	strcpy(buffer, "c[dj[X_dWh_W$Yec$Xh");
         // nova adição
    	escrever = DecriptStr(buffer); // Simplificamos os detalhes, então a call é efetuada o retorno volta em EAX e volta a "referência" para um endereço.
    }

    4º Nosso código está ficando bacana, vamos prestar mais atenção nos próximos detalhes abaixo disso:
     

    call    _puts          ; Chama a função puts para escrever nosso retorno
    mov     eax, 0      ; Lembra da dica de retorno da função ? sim, nosso main também é uma subcall e ele vai retornar 0 
    
    
    Pseudocode:
    puts(escrever);
    
    return 0;

     

    5º Vamos reescrever isso agora no código que já entendemos.

     

    int main(int argc, char** argv) {
    	const char* escrever;
    	char buffer[20];
    	
    	/*
    	mov     dword ptr [esp+1Ch], 6A645B63h       ; Char 1   
    	mov     dword ptr [esp+20h], 645F585Bh       ; Char 2
    	mov     dword ptr [esp+24h], 575F6857h       ; Char 3
    	mov     dword ptr [esp+28h], 63655924h       ; Char 4
    	mov     dword ptr [esp+2Ch], 685824h         ; Char 5
    	
    	
    	ESP[0] =  6A645B63h;
    	ESP[1] = 645F585Bh;
    	ESP[2] = 575F6857h;
    	ESP[3] = 63655924h;
    	ESP[4] = 685824h;
    	
    	Simplificando:
    	strcpy(ESP, "c[dj[X_dWh_W$Yec$Xh")
    	*/
    	strcpy(buffer, "c[dj[X_dWh_W$Yec$Xh");
    	
    	escrever = DecriptStr(buffer);
    	puts(escrever);
    	
    	return 0;
    }


    Dando continuidade com nossa reconstrução e agilizando o processo, analisei a função de DecriptStr e ficou da seguinte forma:
     

    char* DecriptStr(char *stringOfuscada){
    	char *armazenaLocal;
    	armazenaLocal = stringOfuscada;
    	while(*stringOfuscada)
    		*stringOfuscada++ += 10;
    	return armazenaLocal;
    }

    Esse é o algoritmo usado para ocultar as strings do Debugger, basicamente, é relativamente simples esconder alguma string do debbuger, por esse fato devemos também ficar atento no que acontece no algoritmo do mesmo verificar se temos argumentos suspeitos sendo passados.

    Conclusão:
    Esse tipo de algoritmo é muito comum em malwares como o bom e velho XOR, porem são muito utilizados em diversos software que você encontrar durante sua analise, fique atento a isso !

    E para o fim temos o resultado:

    Obrigado pela sua Leitura, e espero que isso tenha sido útil para alguém !

    Saudações a todos. 

    Sem Título.png

    CADE_Algoritimo.zip

    • Agradecer 1
    • Curtir 1
  3. Em 20/11/2017 em 06:07, Pimptech disse:

    Mais um crackme! Esse não tá simples, mas também não tá difícil.
    Coloquei level x, pois não sei bem qual o "level" hahah... Se acharem difícil, vou dosando os demais crackmes. :)
    Tá na mesma pegada do level 0.

    Foi compilado com o GCC(by MinGW) ainda.. Então lembre-se que o código em si começa sempre de um determinado address, mesma coisa do level0.

    O objetivo é achar a FLAG. flag{...

    Quando alguém quebrar eu posto o source. :) 

    crackme_levelx.exe 31 kB · 87 downloads

    Olá criador do desafio,

    Eu reconstruí seu algoritmo mande o original para a gente comparar, isso vai me ajudar nos meus estudos


    O anexo do meu algoritmo reconstruído está aqui espero que seja útil para outros membros também, minha ideia era resolver seu desafio entender reescrever o algoritmo usado para criar a flag.

     

    Por favor faça mais Crack Me'S para a gente.

    Saudações.
     

    screen.png

    Keygen CrackMeX.zip

×
×
  • Criar Novo...