Jump to content

Leandro Fróes

Mente Binária
  • Content Count

    175
  • Joined

  • Last visited

Posts posted by Leandro Fróes

  1. Fala Edvan,

    Que louco você está migrando depois de tanto tempo! Sendo bem sincero eu não acho que tenha uma receita de bolo e mesmo que tivesse, seria diferente de pessoa para pessoa. Não só Análise de Malware, mas toda a área de SI no geral abrange basicamente tudo da computação, literalmente tudo: arquitetura, SO, programação, redes, web, etc. Ou seja, a migração de qualquer um desses lugares para área de SI é muito interessante tendo em vista que você já entra com um background de algo que será muito útil no seu dia a dia/processo de aprendizagem. Sua área por exemplo é necessária em TODAS as áreas de SI, incluindo Análise de Malware e com certeza vai ti ajudar muito.

    Eu particularmente gosto de encarar SI como a forma que vemos as coisas porque no fim do dia, não importa a área, sempre vamos ter que aprender coisas novas. Com SI não é diferente, a questão é que a forma com que usamos o que aprendemos (redes, por exemplo) é aplicada de uma forma "diferente" da normal, com um foco diferente, etc. Resumindo, tente sempre solidificar suas bases que o caminho pra ter essa "mentalidade de SI" vai ser mais natural (não automático obviamente, mas um passo de cada vez!).

    Falando de uma pós, certificação, etc pra mim pelo menos não faz diferença alguma, mas, se fizer pra você, vai fundo, o importante é você aprender mais e mais e se sentir bem com isso ?.

    Eu indico a leitura desse artigo que o Fernando escreveu à muito tempo atrás. Lá tem várias referências legais pra caramba que você pode usar nos seus estudos. Além disso, mas ai parece que você já tá indo com tudo, eu recomendo com certeza todos os vídeos do Papo Binário, principalmente os Cursos começando pelo de C e o CERO.

    Fora o artigo e os cursos eu também indico o livro de Engenharia Reversa que o Fernando escreveu pois ele é bem focado pra quem está começando e é o único sobre o tema em português. Por último vou deixar algumas dicas que funcionam muito bem pra mim e talvez ti ajudem também:

    • Tente sempre aplicar tudo o que você estuda: eu particularmente gosto de programar e uso isso pra aprender muita coisa (C me ajuda muito);
    • Participe de eventos de segurança: lá você aprende, conhece gente nova, troca experiências, enfim, é bom demais;
    • Procure se antenar na área: falando especificamente de Análise de Malware procure saber os novos malwares que estão surgindo, novas campanhas, leia análises e relatórios de ataques. Pode parecer complicado no início mas isso vai ti ajudar muito no seu processo de aprendizagem;
    • Ajude o próximo: a melhor forma de se aprender algo é ensinando;
    • Nunca assuma que você sabe tudo: só uma frase de efeito mesmo hehe mas nunca se esqueça disso, isto é, sempre esteja aberto pra aprender mais e caso você tenha dúvida se aquilo é verdade ou não, comprove você mesmo ?

    Espero ter ajudado de alguma forma.

    Abs.

  2. @Quer Vinho Opa, na verdade você esqueceu de colocar o \n (isto é, o caracter que representa uma nova linha) dentro das aspas para que o printf interprete o resultado propriamente. Por padrão a printf entende o que você passar como primeiro parâmetro pra função como um const char *, então neste caso você não precisa especificar %s como o "formatador":
     

    printf("Mente Binaria eh foda! =)\n"); 

     

  3. Opa,

    Eu acredito que antes de usar qualquer ferramenta é importante entender o que ela está fazendo e como ela faz. Se você está tendo dificuldade em entender o que está rolando quer dizer que tem algo faltando, algum entendimento sobre algo. Exatamente como você falou, você precisa entender melhor o que está rolando "por trás dos panos". É super normal estarmos mexendo em algo e não entendermos direito aquilo, e é justamente por isso que temos que focar na base da computação e no seu caso, a base de redes, coisa que nenhum "curso de hacking" vai ti ensinar ?.

    Acho legal você dar uma estudada na base de redes: o que é um IP, o que é uma porta, por que eles são assim, o que é um socket e por ai vai. Com o tempo você vai ver que ferramentas são só ferramentas, que ajudam a gente a fazer um trabalho, tornam ele mais prático, mas pra saber exatamente o que está acontecendo, pra utilizar a ferramenta direito, só entendendo de fato os conceitos que a envolvem.

    Queria ti indicar esse arquivo aqui que temos no portal sobre como se tornar um bom profissional de segurança, isto é, como começar em tudo!

    Espero ter ajudado em algo.

    Abs.

  4. Só  adicionando em cima do assunto de "menor PE possível", tem uma pesquisa inteira sobre PE do corkami no github dele e lá tem todas as PoCs dele, incluindo um PE com a menor quantidade de elementos definidos que ele conseguiu criar considerando um contexto de execução.

    abs!

  5. Na minha opinião a melhor é aquela que você se sente mais confortável. Não sei se é o caso dessa Olimpíada, mas o que vejo dessas competições são desafios de lógica, ou seja, todas as linguagens conseguem atender a necessidade. A diferença ai vai ser o número de linhas que você usa pra resolver um desafio ou outro, talvez até alguma funcionalidade de uma linguagem em particular (paradigma funcional em linguagens como python, por exemplo), mas até ai nada que não possa ser feito de outro jeito com C, por exemplo.

    Acho que vale você optar pela que você mais tem facilidade porque independente se ela tem recurso X ou Y você vai pensar mais rápido usando ela do que outra na competição.

    Espero ter ajudado, abs.

  6. Fala Helder, blz?

    Isso é definido pelo próprio formato do arquivo e é possível sim achar só olhando pro dump em hexa. Da certo "trabalho" ficar procurando os campos olhando direto pro hexa, mas tenho que dizer, é super divertido e se aprende muito ?.

    Bom, olhando para o dump do arquivo em hexa a primeira coisa que vemos é o DOS Header, que representa os primeiros 64 bytes do arquivo e nele há um campo chamado e_lfanew, que define o offset para a assinatura PE. Esta assinatura é o primeiro campo de outro header chamado NT Header:

    typedef struct _IMAGE_NT_HEADERS {
      DWORD                                         Signature;
      IMAGE_FILE_HEADER             FileHeader;
      IMAGE_OPTIONAL_HEADER OptionalHeader;
    } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

    Como podemos ver a assinatura PE tem o tamanho de uma DWORD, isto é, 4 bytes de acordo com a Microsoft e os campos seguintes são: um outro cabeçalho completo (os bytes dele em si) chamado File Header:

    typedef struct _IMAGE_FILE_HEADER {
      WORD  Machine;
      WORD  NumberOfSections;
      DWORD TimeDateStamp;
      DWORD PointerToSymbolTable;
      DWORD NumberOfSymbols;
      WORD  SizeOfOptionalHeader;
      WORD  Characteristics;
    } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

    E logo depois um cabeçalhado chamado Optional Header, que é um dos mais importantes do formato PE. Este cabeçalho possui dentro dele um campo chamado ImageBase, que é justamente o que você está procurando.
     

    Eu lembro que você parecia estar estudando pelo tutorial que eu fiz sobre o formato PE aqui, certo? No post de número 3 do tutorial eu falo sobre os campos do NT Header e do Optional Header. De qualquer forma, saiba que é sim possível, é só questão de ler o formato da struct na documentação e ir contando byte a byte até chegar lá!!

    Abs

  7. Opa, na verdade ele não mostra a quantidade de strings distintas não. Peguei um binário qualquer aqui como exemplo e rodei readelf -h arquivo pra pegar as informações do ELF Header:

    Cabeçalho ELF:
      Magia:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
      Classe:                            ELF64
      Dados:                             complemento 2, little endian
      Versão:                            1 (current)
      OS/ABI:                            UNIX - System V
      Versão ABI:                        0
      Tipo:                              EXEC (ficheiro executável)
      Máquina:                           Advanced Micro Devices X86-64
      Versão:                            0x1
      Endereço do ponto de entrada:      0x453140
      Início dos cabeçalhos do programa: 64 (bytes no ficheiro)
      Início dos cabeçalhos de secção:   456 (bytes no ficheiro)
      Bandeiras:                         0x0
      Tamanho deste cabeçalho:           64 (bytes)
      Tamanho dos cabeçalhos do programa:56 (bytes)
      Nº de cabeçalhos do programa:      7
      Tamanho dos cabeçalhos de secção:  64 (bytes)
      Nº dos cabeçalhos de secção:       24
      Índice de tabela de cadeias da secção: 3


    Como podemos ver o valor do campo e_shstrndx ali é 3 (última linha). Agora para printar os Section Headers usei readelf -S arquivo:

    Há 24 cabeçalhos de secção, começando no desvio 0x1c8:
    
    Cabeçalhos de secção:
      [Nr] Nome              Tipo             Endereço          Desvio
           Tam.              Tam.Ent          Bands  Lig.  Info  Alinh
      [ 0]                   NULL             0000000000000000  00000000
           0000000000000000  0000000000000000           0     0     0
      [ 1] .text             PROGBITS         0000000000401000  00001000
           00000000000b140b  0000000000000000  AX       0     0     16
      [ 2] .rodata           PROGBITS         00000000004b3000  000b3000
           000000000004fa5d  0000000000000000   A       0     0     32
      [ 3] .shstrtab         STRTAB           0000000000000000  00102a60
           0000000000000193  0000000000000000           0     0     1
      [ 4] .typelink         PROGBITS         0000000000502c00  00102c00
           0000000000000d2c  0000000000000000   A       0     0     32
      [ 5] .itablink         PROGBITS         0000000000503930  00103930
           0000000000000080  0000000000000000   A       0     0     8
      [ 6] .gosymtab         PROGBITS         00000000005039b0  001039b0
           0000000000000000  0000000000000000   A       0     0     1
      [ 7] .gopclntab        PROGBITS         00000000005039c0  001039c0
           0000000000086003  0000000000000000   A       0     0     32
      [ 8] .noptrdata        PROGBITS         000000000058a000  0018a000
    
    ...

    Omiti a saída completa, mas já deu pra ver que tem mais de 3 seções, como estava dizendo no primeiro comando rodado.

    O que rola na verdade é que campo e_shstrndx possui o índice da Section Header Table de uma seção chamada .shstrtab (da pra ver ali na saída do segundo comando), que por sua vez possui dentro dela a Section String Table. Quanto ao sh_name, é simplesmente o índice (offset em hexa) da respectiva seção dentro da Section String Table.

    Pra ficar mais claro vou fazer igual você disse que estava fazendo, ver os bytes diretamente. Deu pra ver pela saída do comando que o array de Section Headers começa no offset 0x1c8. Cada Section Header possui 64 bytes de tamanho e podemos ver que o primeiro elemento deste array está todo zerado, então vou pular 0x1c8 + 0x40 (64 em hexa) com o comando hd -s 0x208 arquivo e ver no que da:
     

    00000208  01 00 00 00 01 00 00 00  06 00 00 00 00 00 00 00  |................|
    00000218  00 10 40 00 00 00 00 00  00 10 00 00 00 00 00 00  |..@.............|
    00000228  0b 14 0b 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000238  10 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    ...

    Os primeiros 4 bytes (lembrando do endianess) representam o índice (isto é, o offset em hexa) do nome desta seção dentro da Section String Table. Se formos até esta suposta table (offset 0x102a60 segundo readelf -S), veremos o seguinte:

    00102a60  00 2e 74 65 78 74 00 2e  6e 6f 70 74 72 64 61 74  |..text..noptrdat|
    00102a70  61 00 2e 64 61 74 61 00  2e 62 73 73 00 2e 6e 6f  |a..data..bss..no|
    00102a80  70 74 72 62 73 73 00 2e  6e 6f 74 65 2e 67 6f 2e  |ptrbss..note.go.|
    00102a90  62 75 69 6c 64 69 64 00  2e 65 6c 66 64 61 74 61  |buildid..elfdata|
    ...
    

    De fato, no índice 00 00 00 01 (ou simplesmente 1, em hexa) está o nome da nossa seção .text na Section String Table.


    Abs.

  8. Eu não lembro porque postei isso na época, mas deve ter sido pelo fato de um tempo atrás eu ter um preconceito muito grande quanto à certificações. Hoje eu posso dizer que continuo com o pensamento de que elas não podem provar seu conhecimento de fato, mas admito que elas ajudam um pouco dependendo do caso ? .

  9. Opa, vou reviver esse post aqui. De uns tempos pra cá as vezes ando brincando com Go e tenho que dizer,  a linguagem é muito interessante. Eu curti muito essa pegada única dela de interagir com API e ao mesmo tempo ser robusta e bem estruturada.

    Vocês fizeram algo com Golang? Acho que até agora só fiz scripts pra interagir com API e uns programas pra agilizar meu trabalho ?.

    Abs.

  10. Opa, vamos lá:

    1. Isso aqui de fato não temos, mas parece ser uma boa.
    2. Há um espaço no seu perfil onde você pode colocar o link do seu website, github, gitlab, linkedin, etc.
    3. Mesma coisa que o número 2.

    Abs!!

  11. Fala @HelderPereira. Os primeiros 64 bytes de um arquivo no formato PE pertencem ao DOS-Header. Os primeiros passos do loader são:

    1. Checar se os dois primeiros bytes do arquivo são iguais à "MZ".
    2. Ir até o campo e_lfanew do DOS-Header (offset 0x3c) e ler a DWORD dentro dele, isto é, os 4 bytes deste campo.
    3. Pular para o offset lido e ver se ele é igual à "PE\0\0", ou seja, a assinatura PE.

    Notou alguma coisa? O campo e_lfanew fica dentro do DOS-Header e ele possui o offset para a assinatura PE. Caso ela não exista, o arquivo é considerado um "não PE", do contrário, o loader continua seu trabalho analisando os outros cabelhos.

    Obrigado pela pergunta e qualquer coisa só mandar bala.

    Abs.

     

  12. Opa, achei esse do tanenbaum um pouco complicado na época que li (não li todo no caso) . Tem um que é a mesma pegada, mas um pouco mais leve do Mario A. Monteiro chamado Arquitetura e Organização de Computadores.

    Eu não sei de muitos livros sobre o assunto, e se você me perguntar a maior referência eu diria que é o próprio manual da intel, mas eu não sei se é uma boa começar por ele, principalmente se você não tem um background de computação (não sei qual é o caso).  E ah, estudar assembly, por exemplo, ajuda a entender MUITO sobre a arquitetura do seu computador ?.

  13. Opa, você diz interpretar um valor em hexa utilzando a linguagem C? Ou literalmente pegar um arquivo binário e tentar transformar em C?

  14. Fala @SiriusB.

    Cara eu não consegui entender muito bem, você poderia postar um print? No caso, só pra confirmar, você tem ctz que esse é o OEP né?

    Sobre fazer Engenharia Reversa no software X ou Y, sim, da pra fazer Engenharia Reversa no que você quiser, só não esqueça que nem sempre é permitido. ?

  15. Fala @sayseven blz? Cara, eu não tenho uma cópia do site não, mas se eu não me engano alguém por aqui tem, já tentou perguntar no nosso canal do discord? Eu lembro que o máximo que eu fiz foi imprimir alguns artigos da vovó Vicki ?

  16. Boa tarde pessoal, tudo certo?

    Como vocês podem ver tínhamos dado uma pausa nos desafios, isto para dar mais tempo à aqueles que não tentaram ainda ou não resolveram os desafios anteriores. Isto não significa que os desafios pararam, certo??? Então aqui está o nosso sétimo desafio, espero que curtam bastante o fds revertendo !!!

    AnalyseMe-06.exe

  17. Boa noite galera, tudo certo??

    Adivinhem o que temos pra esse começo de ano?? Isso mesmo, fim de semana debuggando ?. Queremos também saber o que vocês estão achando, se está muito difícil, muito fácil, se está na medida certa, etc. Lembrando que qualquer feedback é válido.

    Um ótimo fim de semana e bom debugging.

    Abs

    AnalyseMe-05.exe

  18. Faaala galera, planos pro fds? Espero que não pois aqui está o nosso terceiro desafio da série AnalyseMe. Para aqueles que ainda não fizeram os desafios anteriores eu indico fortemente fazer e postar para a galera se ajudar e aprender junto. Qualquer dúvida fique a vontade para perguntar também.

    Lembrando que é pra postar a solução usando o modelo e entre tags spoiler (olhinho.png.f1c595fbcc6c51c97cd8ab5e67d1fe54.png):

    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


     

    Abraços!

    AnalyseMe-02.exe

  19. Fala galera, tudo certo?

    Segue o nosso segundo desafio da série AnalyseMe. Outra coisa, lembram daquele modelo de relatório do AnalyseMe - Nível 00? Aquele é um padrão para vocês manterem o foco, para saberem que aquilo é importante dar uma olhada. Caso não consigam encontrar todos os campos fiquem a vontade para postar o que acharam, a idea aqui é aprendermos juntos e ajudar quem precisa.

    Se você ainda não postou sua análise porque alguém já postou antes, posta lá!! Não esqueça que cada um tem seu ponto de vista e isso é muito importante! ?

    Queria também agradecer à todos que fizeram o primeiro tópico movimentar. Para aqueles que ainda não fizeram/postaram o desafio, tá esperando o que?!?!?! ?

     

    AnalyseMe-01.exe

×
×
  • Create New...