Jump to content

Leandro Fróes

Mente Binária
  • Posts

    183
  • Joined

  • Last visited

  • Country

    Brazil

Posts posted by Leandro Fróes

  1. Fala @Aof, blz?

    A ideia do desafio é justamente você verificar esse tipo informação (se tem packer, linguagem utilizada, ideia do binário em si, etc).

    O curso do CERO e o livro com certeza são o suficiente para esta análise. Sobre as ferramentas você pode dar uma olhada no artigo que Linkei ali na descrição, mas fique a vontade pra usar as ferramentas que se sentir mais confortável ?

    abs

  2. Boa tarde galera! Como vocês estão?

    Faz um tempinho que estamos pensando sobre algo que possa ser postado semanalmente aqui no portal, algo que seja curioso, desafiador, divertido, mas que prepare para situações reais. Com isto em mente estamos lançando hoje a série de desafios chamados AnalyseMe, que são postados nesta área toda sexta-feira.

    O intuito é treinar análise de malware. Portanto os binários conterão rotinas maliciosas e por isso é estritamente necessário que sejam analisados em um ambiente controlado (máquina virtual).

    A ideia é simples: aplicar os conceitos de engenharia reversa que aprendemos nos nossos estudos, mas de uma forma direcionada à análise de malware (falando nisso, você já leu o nosso livro e viu o nosso curso?! ?).

    Os participantes devem analisar os programas aqui postados e responder o tópico com sua análise. Desta forma podemos tirar dúvidas e ter visões diferentes sobre o mesmo binário, facilitando o aprendizado. Desenvolvemos também um modelo de relatório que esperamos receber como resposta (use a tag spoiler, que é o olhinho na barra de ferramentas: olhinho.png.afdcdecf6e6565ed84d0e9c3152157c6.png) . Segue exemplo:

    Spoiler


    1. Tipo de arquivo: PE EXE
    2. Compilador/linguagem: Borland C++
    3. Protector/packer: Nenhum
    4. SHA-256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    5. Strings interessantes: X, Y, Z
    6. Funções locais maliciosas: 405040 (faz tal coisa), 403570 (faz coisa e tal)
    7. Chamadas à API do Windows e outras bibliotecas: CreateWindowExA(parâmetros), InternetOpenFileA(parâmetros)...
    8. Atividades de rede: resolve o domínio X, baixa Y da URL Z
    9. O que o binário faz em linhas gerais: Rouba as senhas armazenadas no browser.
    10. O que foi modificado no sistema: o arquivo X é criado e uma chave de registro é adicionada em HKLM\Microsoft\Windows\CurrentVersion\Run com o valor c:\binario.exe


     

    O nível de detalhe da análise fica a critério de vocês, só tomem cuidado para não sair muito da ideia principal, guiada pelo formulário. Caso vocês achem necessário mais algum item no formulário fiquem à vontade para colocar junto da sua análise.

    Qualquer dúvida/sugestão/ideia estamos sempre à disposição. Vamos lotar isto aqui hein. ?

    E agora, sem mais delongas, segue o primeiríssimo desafio: 

    AnalyseMe-00.exe

    Lembrando que alguns itens do relatório podem estar em branco para cada desafio. Por exemplo, o binário pode não ter atividade de rede ou não ter nenhuma string interessante, etc. Agora é contigo! ?

  3. Entendi...

    Nossa comunidade tem foco no estudo das base da engenharia reversa em si, no porquê das coisas e na inserção de novatos na área. Como você já deve ter visto, temos vários cursos que tratam do assunto como por exemplo o CERO e o de Programação Moderna em C. Aparentemente você quer contratar os serviços de alguém, mas a maioria aqui tá estudando. Só avisando caso não encontre exatamente o que procura aqui. ?

    De qualquer forma, seja bem vindo! Espero que dê sorte e resolva seu problema! \o/

  4. Boa tarde @toto9202, tudo bem?

    Dê uma olhada neste vídeo aqui. Ele fala justamente sobre o ASLR( o motivo dos endereços serem randômicos a cada execução) e como desabilitar isto.

    Sobre os debuggers... não se prende muito nisso não, todos fazem quase a mesma coisa, o que difere são as funcionalidades, mas a engenharia reversa da pra você fazer em todos se souber a base e sim, terão sim desafios, inclusive o último vídeo do CERO é um.

    Qualquer dúvida sobre o ASLR, onde este bit fica etc etc só mandar bala aqui.

    Abs

     

  5. Olá @Jhon Oliveira, tudo bem?

    Fique a vontade para postar sobre Web no portal (tutoriais, dicas, sugestões, dúvidas). Se o seu caso for um artigo de fato nós temos uma área do fórum focada para isto: https://www.mentebinaria.com.br/artigos . Caso você queira seu artigo aqui só escreve-lo (se puder seguir mais ou menos o padrão de escrita que estes do link seguem seria excelente também) e mandar pra nós do Mente Binária que iremos avaliar e se for o caso postar em seu nome ?

    Abs,

    Leandro

  6. Boa tarde @AdrianoLima, tudo bem?

    Interessante a ideia do blog, inclusive esse é o foco aqui do Mente Binária como um todo: trazer conhecimento para todos, dar espaço para todos escreverem artigos, tutoriais, dicas, perguntar, debater etc...

    Sabemos que isso da uma trabalheira e tanto. Tendo em vista isto, não acha mais interessante usar uma plataforma já existente (o próprio Mente Binária, por exemplo) para isto? Para seus artigos é interessante sim ter seu próprio blog (se quiser colocar aqui também seria ótimo), mas para a galera interagir e tal fica bem mais fácil por aqui, onde já temos tudo preparado (vídeos, portal, discord) para a comunidade e para quem quer aprender/ensinar ?

    Só uma dica mesmo, mas se não achar viável só mandar bala com o blog, qualquer fonte de conhecimento é sempre bem vinda.

    Abs!!!

  7. 35 minutos atrás, Felipe.Silva disse:

    Não é questão de ter faltado detalhes, mas sim os que você deu estavam errados.
    Mas eu entendo o seu ponto.

    Saquei, o que estava errado além do exemplo da instrução então? Até onde eu sei os 3 pontos levantados foram relacionados ao exemplo errado que dei da instrução (endianness etc), mas não aos outros detalhes. Gostaria muito de saber =D

  8. 45 minutos atrás, Felipe.Silva disse:

    Desculpe, mas eu devo fazer três correções.

    1) Na verdade o opcode nessa instrução é somente o byte E8. Os outros quatro bytes são um valor imediato.
    Como uma analogia, pense que o opcode é "o nome da função" e os bytes seguintes são "argumentos" para essa função.
    Algo como:
     

    
    e8(0x78563412);


    No artigo da Wikipédia sobre código de máquina eu detalhei como uma instrução em código de máquina da arquitetura x86 é formada.
    Nele eu especifiquei sobre o formato da instrução e expliquei sobre os prefixos.

    Em resumo uma instrução de código de máquina pode haver prefixo, opcode, o byte ModR/M, o byte SIB, endereço de deslocamento e um valor imediato.
    É muito mais do que simplesmente opcode.

    2) Na verdade os dados ficam em little-endian, logo a sequência de bytes 12 34 56 78 não formam o valor 0x12345678...
    Mas sim 0x78563412.

    3) Tanto jmps quanto calls "curtos" (near) em código de máquina trabalham com endereços relativos.
    Então o call E8 12 34 56 78 na verdade não irá chamar uma instrução localizada no endereço 0x78563412...
    Mas sim executar a instrução 0x78563412 bytes a frente.
    Um exemplo básico:
     

    
    org 0x100
    
    call teste
    ret
    
    teste:
        nop
        ret


    Trabalhando na sua suposição o call na linha 3 iria ser: E8 06 01
    Ou seja, um call para o endereço 0x106.

    Mas na verdade é E8 01 00
    Que seria um call para a instrução 1 byte a frente. (ret tem o tamanho de 1 byte, C3)
     

    Apenas calls e jmps "longos" (far) que usam o endereço exato. Os curtos usam endereço relativo.
    Então por exemplo a instrução call 0x7000:teste iria gerar:
    9A 06 01 00 70

    Dessa vez sim especificando o endereço exato. (0x106 no segmento 0x7000)

    Felipe, minha intenção com o exemplo foi meramente ilustrativa, até porque o Luciano está aparentemente começando a estudar sobre o assunto agora. Tendo em vista isto eu não me preocupei com tantos detalhes e os omiti, até porque tem trilhões ai nesse meio que o Loader executa, como GetProcAddress, preencher a IAT e por ai vai ? .

    Sobre o opcode, sim, verdade, o exemplo foi ruim e errado.

    Valeu de qualquer forma!!!

  9. 1 hora atrás, Luciano Estevam Rangel disse:

    Pessoal, muito obrigado pelas respostas. Realmente estava confuso com relação ao fluxo de como as COISAS acontecem.

    Exemplo:

    Quando criamos um programa em assembly: A apartir do momento em que executo este programa, como seria esse fluxo? As instruções são carregadas na memoria RAM -> Depois tratadas pelo processador -> Devolvidas a memoria RAM. Ai começam a vir uma serie de duvidas, do tipo. Quem carrega as instruções na RAM? E o processador em alguma area interna? Nao sei se consegui explicar muito bem? Pelo que ficou do meu entendimento, o programa e carregado na memoria com uma seria de instruções, essas instruções sao carregadas nos registradores para permitir que o processador execute o calculo atraves da ALU, e depois retorna esse resultado para armazenamento em memoria.

    Eu inclusive achei um doc na NET, que chega bem proximo a essa explicação.

    http://savannah.c3sl.ufpr.br/pgubook/ProgrammingGroundUp-0-8.pdf

    Desculpem novamente pelas duvidas basicas, mas pra quem nao tem essa vivencia, fica um pouco confuso. Mas é so o começo

    Obrigado a todos.

    Vou falar como um executável roda no Windows de forma resumida, mas creio que já ajude a entender melhor...

    Quando temos um .exe, por exemplo, aquilo é um arquivo e este está no DISCO (todos os bytes bonitinhos, um do lado do outro etc). Este arquivo tem um padrão, uma especificação para o Sistema Operacional entender o que de fato ele é, no caso de binários windows este formato se chama PE.

    Quando executamos este programa quem entra em ação é o Loader. Este carinha lê os cabeçalhos do arquivo em disco para recolher informações de como irá rodar este binário, informações como quanto de mem´ória tem pra Stack, Heap, número de seções etc etc. Depois disso ele pega todas as seções do arquivo em disco e as mapeia para a memória. Só pra deixar claro, quando executamos um programa, ou seja, um processo passa a rodar etc, estamos trabalhando com endereços VIRTUAIS e não físicos (quem traduz de um pro outro é o próprio sistema operacional).

    Cada seção possui um tipo de dado diferente, com permissões diferentes etc. A que contém código executável, por padrão na maioria das vezes, se chama .text. Nela estão os opcodes, ou seja, as INTRUÇÕES própriamente ditas que irão executar no processador, resumindo, bytes ? . Quando dizemos opcodes estamos dizendo as intruções em si, por exemplo, estes opcodes indicam uma chamada de função para o endereço 12345678:

    E8 12 34 56 78

    Note que a instrução e o endereço já estão nos opcodes dentro da seção em disco, o loader apenas as carrega em memória e depois o processador as executa, sem mágica ?. A mesma coisa acontece com os registradores, quando movemos algo de um registrador para o outro esta instrução já foi "decodificada" pelo compilador.

     

    Espero ter ajudado, se quiser mais detalhes só pedir pra galera ou mandar uma msg no discord, vc que manda. Aconselho também a continuar acompanhando  o CERO, lá está sendo passada toda a base necessária pra você entender tudo isso.

     

    Abs!!!

  10. 50 minutos atrás, Felipe.Silva disse:

    Resposta curta: Nunca

    Acho que você não entendeu o que é um registrador.
    Um registrador é uma pequena área de memória que fica dentro do processador, ela pode ser acessada de maneira muito mais rápida do que a memória RAM. (por causa do hardware)

    Quando você define o valor de um registrador está mudando o valor daquele registrador e apenas isso, o processador não vai "enviar" os dados nos registradores para a memória RAM.
    O registrador não é tipo um cache para acessar a RAM.

    Você deve ter se confundido porque deve ter lido algo sobre os registradores serem usados para armazenar dados temporariamente.
    Essa explicação se dá porque é muito mais rápido se você carregar os dados da memória e jogar em um registrador, trabalhar com esses dados no registrador e depois você jogar os dados de volta na RAM.
    O processador não vai fazer isso magicamente, é só um "truque" que o programador faz para otimizar tarefas de loop, por exemplo.

    Se quiser aprender sobre as instruções da linguagem Assembly, eu recomendo usar como referência o site c9x.me.
    Ele não tem um sistema de pesquisa mas você pode usar o Google para encontrar referências das instruções.
    Exemplo de pesquisa: site:c9x.me mov

    Com a pesquisa acima podemos encontrar a referência da instrução mov.
    No site tem uma explicação sobre a instrução e até mesmo um pseudo-código para explicar o que exatamente a instrução faz.

    Quando utilizamos o Modo de Endereçamento direto o acesso é "direto" à memória, não? É utilizado um registrador de Segmento junto do Offset (que pode ser de 16 ou 32 bits) ou endereço linear do operando. Outra coisa é que um registrador pode sim conter um endereço de memória para ser lido e/ou escrito, a própria instrução MOV lê para depois escrever em algum lugar ?

  11. 45 minutos atrás, Naelson Goncalves Saraiva disse:

    Blz, deixa eu entender esse assembly e logo entro no radio, tenho conhecimento de c/c++ mas nem da de ter uma conversa a nível com vocês, Ta osso pra crl. Frederico Pissarra ainda brinca na apostila dele que isto não é difícil aprender. 

    Que isso rapaz, com ctz você é capaz de conversar com todos, assim como qualquer um é. Não se menospreza não, o mais importante é sua vontade de aprender. Manda um salve lá sem medo ?

  12. Interessante, ta ai uma coisa que eu quero tentar um dia, engenharia reversa em jogos, mas no momento eu realmente não sei sobre ?

     

    Seguindo mais ou menos o que você mostrou: ela não ta mexendo nos endereços e sim diretamente nas instruções. Eu realmente não sei como ela acha tal funcionalidade em tal parte do código(você disse que não rola bp, né?!), mas se achar ela pode mudar tanto em um debugger quanto em um editor hexa (tomando cuidado com o número de bytes que ela tem pra cada instrução etc). Tenha em mente que todas as seções estão em disco, ou seja, estão no arquivo e quando o programa é executado o Loader as mapeia em memória. Todas as intruções do código executável (da seção .text, por exemplo) estão no arquivo e podem sim ser vistas por um editor hexa, basta saber procurar hehe.

     

    Se você não entendeu bulhufas do que falei manda uma msg lá no discord qqc que a gente troca uma ideia, mas também aconselho a ver o curso de engenharia reversa do CERO. Sobre descobrir o que os opcodes fazem, da uma olhadinha aqui qqc http://ref.x86asm.net/

     

    Abraço!!

  13. 9 minutos atrás, Naelson Goncalves Saraiva disse:

    Isso que iria pergunta agora, eu acompanhei o projeto de uma gringa fera  no eng rv, e ela fazia esse HEX de trás para frente, me ajudou muito, ela falava sobre PE format também , great content,  ainda vou descobrir como ela encontrava no Hex Editor enable de funcionalidade x do game  .exe 

    Boa tarde!

    Não sei se entendi, ela achava no editor como habilitar certa funcionalidade de um jogo?

  14. Em 26/04/2018 em 08:39, dudsdev disse:

    Massa Leandro..

    Esse conhecimento de base, que você citou no início do post dizendo sempre está estudando, quais são os conteúdos que sempre temos que reforçar?

     

    Abraço!

    Opa, tudo bem mano?

    Então.. falar de forma específica ´é meio complicado, mas eu resumiria (de forma geral) em: Sistemas Operacionais (mais de um mesmo), programação, redes e arquitetura de computadores. Tem um artigo bem legal falando sobre como iniciar na área aqui no portal e ele fala também várias referências, este aqui.

    É bem difícil conciliar tudo isso, pois é MUITA coisa e você nunca para, mas se você organizar certinho e fazer uma linha você vai aprender MUITO ?

    Qualquer dúvida só falar, abs!

  15. Bom dia mano!

    Antes de qualquer coisa, por que você não testa e caso dê algum erro (ou até mesmo se der certo) você coloca aqui pra galera?

    abs

  16. Boa noite mano, tudo bem? Bacana o post, mas posso dar uma sugestão? Acho que além de postar o link é interessante dar uma breve explicação sobre o que se trata. As vezes quem lê não quer clicar, só simplesmente saber o que é ou algo assim (além do post ficar mais completo).

    Abraço!!

  17. 2 horas atrás, bornman disse:

    O IP estava certo, 192.168.15.x, agora ele só consegue se conectar com o IP do modem, os outros está dando timedout. Coloquei sock.settimeout(0.5), será que está muito baixo? Ou será que pode ter algo relacionado ao meu firewall?

    Pera, resolveu o outro erro e agora ta com timeout? Poderia postar a saída?

  18. 1 hora atrás, bornman disse:

    Opa, obrigado Leandro.
    Esse IP eu tinha colocado apenas no código aqui como exemplo hehehehe. Essa parte do 0 e 255 eu realmente não sabia, estou lendo um livro de redes mas ainda estou no começo. Vou tentar fazer utilizando threads pra ver se consigo realizar o scan de forma mais rápida.

    Leia sim, redes é muito importante saber.

    Entendi, mas quando deu o problema você colocou qual IP?

×
×
  • Create New...