Jump to content

Fernando Mercês

Administradores
  • Content Count

    637
  • Joined

  • Last visited

  • Country

    Brazil

Everything posted by Fernando Mercês

  1. Opa, que legal que tá pondo isso em prática! O @Thiago de Queiroz certamente pode explicar melhor, mas acredito que a forma como esteja fazendo não seja muito efetiva porque estás usando trace over (ou seja, não entra nas funções) e a função que é chamada quando qualquer evento na janela do programa ocorre (tipo o clique de um botão) não está na WinMain (que é essa que você postou o disassembly). Esse código de 4010F1 até 40111B é um loop clássico de uma janela usando a Win32 API. Antes de ele ser executado, é definida uma estrutura do tipo WNDCLASSA, que vai ser registrada com a RegisterClassA(). No teu código, a inicialização dessa estrutura começa em 40101D. Conforme a documentação, o segundo elemento dela é o seguinte: lpfnWndProc Type: WNDPROC A pointer to the window procedure. You must use the CallWindowProc function to call the window procedure. For more information, see WindowProc. "Window procedure" que dizer: a função que vai tratar os eventos da janela. No caso do teu programa, o valor deste elemento é colocado com esse MOV em 401027. Como o x64dbg já o reconhece como WndProc, você pode ddar um Ctrl+G e digitar "WndProc" pra cair nela. Recomendo fazer um trace over no mínimo a partir dela, mas ainda podem haver mais calls que vão fazer o trace parar. É que a abordagem de "traçar tudo" que você tá tentando fazer é muito custosa. Tracing é incrível mas na minha opinião é pra ser usado a partir de algum ponto. Não sei o que os demais pensam sobre, nem uso muito tracing também. Mas enfim, belo tópico! 😉 EDIT: Outra coisa que lembrei é que você pode usar Message Breakpoints como neste tutorial. Ao parar na USER32.DLL, ao invés de fazer o esquema de breakpoint on execution na .text, pode simplesmente ver a call stack (Ctrl+K) e ir no último endereço do módulo principal. Vai parar direto no código do clique do botão OK da janela "Register". Aí é só tracear de lá. 😉 Abraços!
  2. Sim, é uma fraqueza em minha opinião também. Eu recomendo usar apps que tenham suporte à senha/digital/reconhecimento facial etc ao serem abertos. No iOS, conheço o Outlook (free) e recentemente conheci o Canary (pago). Pra Android não sei. Dá uma olhada nesse artigo também ó: Abraço!
  3. Fernando Mercês

    MBConf@Home v3

    until
    Nós de novo com nossa conferência, totalmente online e gratuita! Todas as informações sobre a MBConf estão disponíveis em http://menteb.in/conf . Se você já viu tudo lá e quer se registrar, basta confirmar sua presença aqui. Pouco antes do horário de início da conferência você receberá um link para ingressar nela. Agenda 10h00 - Abertura - Fernando Mercês 10h15 - Fio Cavallari - Decodificando malwares web: uma história de dor e sofrimento 11h05 - Thiago Marques 11h55 - Jan Seidl 12h45 - Bruno Oliveira 13h35 - Encerramento Lembre-se de compartilhar a conferência nas suas redes sociais. 😎
  4. Oi Gabriel! Que eu lembre o instalador do IDA já instala tudo que precisa. Se for original você pode postar no fórum deles, mas se for piratex aí fica difícil, pois o instalador pode estar zuado, pode até conter vírus, enfim, não sabemos. 😞 Abraço.
  5. Mais uma: 1.Qual seria o risco no mundo real pra isso (já que você citou que está aberto e encontra com o shodan)? 🙂
  6. E aí, galera, fazemos uma v3? Se sim, respondam aí! Fazemos uma por mês? Uma por ano? Vocês escolhem aê, depois discutiremos e vamos ver o que sai. 🙂 Obrigado por participarem disso! 💚
  7. Pergunta que surgiu e não tempo ó: 2.é possível utilizar a GPU para processar mais rapidamente esses comandos?!?
  8. Perguntas que surgiram no chat: 1.Em um CTF, é possível que as máquinas virtuais vulneráveis passado para o participante de alguma forma ao atacar a máquina, há possibilidade de serem atacados? 2.como faço para treinar nesses ctf? 3.tem algum site para iniciantes?
  9. Hoje eu tava lendo um blogpost da Sophos, LockBit ransomware borrows tricks to keep up with REvil and Maze, quando esse trecho me chamou a atenção: Pelo que entendi os autores basicamente implementaram o que a IsDebuggerPresent() já faz. Dá pra ver o código dela por qualquer disassembler. No caso usei a linha de comando do x64dbg (pode carregar qualquer binário, mesmo que ele não importe a IsDebuggerPresent): d IsDebuggerPresent Vai cair em algo como: 7524A480 | FF25 680E2B75 | jmp dword ptr ds:[<&IsDebuggerPresent>] | Aí é só dar [ENTER] que o x64dbg segue o salto e mostra o dissasembly da IsDebuggerPresent: 769A4940 | 64:A1 30000000 | mov eax,dword ptr fs:[30] | 769A4946 | 0FB640 02 | movzx eax,byte ptr ds:[eax+2] | 769A494A | C3 | ret | Já que é na KERNELBASE.DLL que a implementação da função realmente está, poderia ter digitado direto no x64dbg também: d kernelbase.IsDebuggerPresent Tem mais detalhes sobre essa BeingDebugged flag na aula 24 do CERO. 😉 Fiz tópico só pra dar um exemplo de que mesmo coisas básicas vistas no CERO estão por aí nos blogs das principais empresas de segurança do planeta, ou seja, o conhecimento que trabalhamos aqui é útil profissionalmente. Podem ter certeza. Por mais iniciante que seja, a gente busca entregar coisas sólidas, que certamente são usadas no mercado. Abraço!
  10. https://github.com/Turing-Tecnologia/Processo-Seletivo-Trainee/
  11. Posta o que você já fez e onde exatamente estão suas dúvidas, Bruno. Do contrário acho que não muito como a galera ajudar... 😉 Abraço!
  12. Fernando Mercês

    Seja Apoiador! 💚

    O Mente Binária foi criado pelo @Fernando Mercês em 2007 como um blog, já com a intenção de compartilhar técnicas para resolver problemas comuns no dia a dia técnico de um profissional de TI. De lá para cá, foram várias mudanças. Passamos de blog a fórum, empresa de treinamentos, até que chegamos ao formato atual de uma instituição sem fins lucrativos suportada pela comunidade. Nosso objetivo é de integrar profissionais de segurança, ajudando, principalmente os iniciantes, a estruturarem suas carreiras, aumentarem seu conhecimento técnico de base e com isso melhorarem suas vidas. Parece difícil? Acreditamos que não. Milhares de pessoas consomem nosso conteúdo mensalmente, que entregamos através de vários projetos na área. Alguns deles são: O portal que você está acessando agora, com quase 5000 membros, onde publicamos artigos, dicas e mantemos um fórum de discussões para a comunidade. O nosso canal no YouTube Papo Binário, com mais de 26000 inscritos onde já publicamos mais de 400 vídeos de conteúdo sobre segurança, Linux, engenharia reversa, carreira e entrevistas com profissionais da área. Nosso livro Fundamentos de Engenharia Reversa, que você encontra sempre atualizado. Os softwares que fazemos, todos livres e publicados de forma colaborativa, com código e comentários. Os treinamentos que publicamos, todos gratuitos. Para tudo isso ser possível, contamos com uma empenhada equipe de 6 pessoas. Projetos como o Papo Binário têm um custo elevado com viagens para entrevistas, equipamento, edição e produção de áudio e vídeo. O portal também tem custos de hospedagem, domínio e da plataforma. Não conseguimos arcar com tudo sozinhos. Para continuar oferecendo este conteúdo de maneira isenta, livre de influências patrocinadas, precisamos de doações e por isso lançamos mão desta campanha para você, que curte nosso trabalho, se tornar um apoiador do projeto, no estilo patrono. É bem simples: você nos ajuda a continuar e passa a fazer parte do núcleo da nossa comunidade. Olha só as vantagens que você recebe ao doar: Badge de apoiador aqui no portal. Acesso à área Núcleo, onde você será consultado sobre decisões importantes e novos projetos. Após 3 meses de apoio, você passa a tar descontos/vantagens e até gratuidades em ingressos dos seguintes eventos parceiros: BHack BSides Roadsec Desconto de 10% nos treinamentos de C/C++ e C++ com Qt da Agit Informática. Relatório de transparência financeira, postado mensalmente na nossa área Núcleo. Afinal, você tem direito de saber como sua doação está sendo utilizada! Outras vantagens que lançaremos no futuro, sempre pensando em você! Nosso eterno e verdadeiro agradecimento por ajudar a levar conteúdo de qualidade para milhares de brasileiros, incluindo você! 😍 Quero apoiar! Legal, agora é só doar para a campanha no apoia.se e escolher entre cartão de crédito ou boleto bancário! 💚 Já doei. Como acesso a área Núcleo? Basta enviar uma mensagem para nós pelo formulário de contato informando seu nome de usuário aqui no site e o e-mail utilizado para a doação. A @Gabrielle Alves vai ter o maior prazer em te responder! 💚 Tenho uma empresa, como posso apoiar? Se você tem uma empresa pode ajudar a tornar este sonho realidade com uma doação maior. Em troca podemos colocar seu logotipo nos vídeos do canal Papo Binário, além de te oferecermos as vantagens de membro Apoiador. Outra ajuda é enviar esta página para seu mailing de clientes ou participantes de eventos! Por favor, entre contato com a gente!
  13. Oi Halison! Olha, não acho que exista uma "forma correta", viu... Se você patcheou ou mesmo impediu "por fora do malware", ou seja, pelo sistema que a ecriptação ocorresse, em minha opinião já foi. Tá feito. Em vários casos nem é necessário impedir a encriptação, ou esta é feita a cada execução, tanto faz. Na aula 3 do AMO pus em prática a ideia de patchear a função que encripta, mas tem certamente muitas outras maneiras e acho que a certa é a que funciona. 🙂 Como no seu caso funcionou, parabéns! Em minha experiência, análise de malware não é um conjunto de técnicas, é uma aplicação de vários conhecimentos que quase sempre resulta em diferentes soluções para diferentes problemas mesmo. Abraço!
  14. @maycon uma pergunta que resgatamos do chat: 2.Se o código smali é similar a um disassembly e ele tem equivalentes diretos com o próprio código java, qual a vantagem da existência do código smali? A propósito, pode por seus slides no primeiro post deste tópico? Só editar como quiser. 😉 Abraço!
  15. @Wanderley Caloni temos uma pergunta não respondida 🙂 - eu tenho interesse de brincar com essa parte de escrever kernel pra linux, etc, oq vc recomenda para eu comecar a aprender?
  16. @Thiago de Queiroz seguem mais perguntas que surgiram no chat: 1.Qual a diferença deste debug para o WinDbg? 2. Este debug tmb converte o código para c? 3. Isso funciona mesmo se o executável for gerado sem as diretivas de debug? 4. Os endereços de memória das áreas de .txt, .data e .rsrc se encontram no cabeçalho PE? Abraço!
  17. @Sergio Prado obrigado pela palestra! Seguem as perguntas que resgatamos do chat: 1. Pls qual o endereço do site de exploiters de hardware? 2. É possível acessar a Jtag de Macs para análise de hardware para fins de manutenção? 3. Por onde um iniciante pode começar a estudar hardware hacking? 4. Gostaria de perguntar se existe uma opção ao bus pirate para dump de memória eeprom? e se o ch341a pode ser utilizado para essa finalidade? 5. O que os fabricantes estão fazendo para bloquear a leitura através desses vetores? (UART e JTAG). 6. Como compilar o firmware extraido do binwalk em um bin e enviar ele de novo pro device? 7. existe um curso para iniciante no site de Introdução ao Hardware Hacking? Ah, pode editar o post inicial do tópico pra inserir os slides de sua palestra por favor? Fique à vontade para editar o texto também, se precisar. Grande abraço!
  18. @rmarinho seguem as demais perguntas que resgatamos do chat! 🙂 10. A detecção desses dispositivos vulneráveis é feita normalmente por onde? ferramentas como o shodan? 11. Skaros e checkers funcionam no mesmo princípio de namenode e datanodes em clusters? Derrubando os namenode (skaros) derruba a botnet...não digo tecnicamente, mas na infra, abs. 12. Na pesquisa houve colaboração de outros profissionais de outros países? 13. Essa ausência de comandos para atacar terceiros não pode ter sido por conta do bloqueio que você fez quanto às comunicações de saída, permitindo apenas pacotes SYN? 14. É possível através da Botnet, resolver questões das credenciais? Exemplo: COmando de mudança de senha? 15. Os Skaros tinham controle independente da rede ou tinha um nível acima de controle sobre eles, foi possível identificar isso?
  19. Fernando Mercês

    MBConf@Home v2

    until
    Nós de novo com nossa conferência, totalmente online e gratuita! Todas as informações sobre a MBConf estão disponíveis em http://menteb.in/conf . Se você já viu tudo lá e quer se registrar, basta confirmar sua presença aqui. Pouco antes do horário de início da conferência você receberá um link para ingressar nela. JÁ TÁ ROLANDO: Agenda 10h00 - Abertura - Fernando Mercês 10h15 - Conhecendo InfoSec jogando CTF's - Rafael ChOkO 11h05 - Abusando de fuzzing no Windows - Otavio Silva 11h55 - Escalação de privilégios no Linux - Victor Mello 12h45 - Hacking em dispositivos hospitalares - Pasknel Ribeiro 13h35 - Encerramento - Yumi Ambriola Lembre-se de compartilhar a conferência nas suas redes sociais. 😎
  20. Fantástico, @Wanderley Caloni! A equipe toda se emocionou com suas palavras. Eu jamais imaginei que passaríamos uma imagem de bem organizados, ainda mais no primeiro evento. Mas conseguimos! Obrigado pela sensibilidade, pontualidade, pela apresentação incrível e pelo conteúdo! Abraço!
  21. Desculpa, gente. O site tá com muitos acessos e levou uns tombinhos. hehe
  22. Version 3.0.0.1

    20 downloads

    Editor de recursos (seção .rsrc), tipo o ResHack. Coloquei aqui porque tá sumindo da internet e não podemos deixar isso acontecer. 🙂
  23. Ano passado eu assisti à uma palestra sobre esse novo utilitário da suíte GNU chamado poke. Ele é um editor de dados binários de linha de comando bem diferente dos que costumo usar (HT Editor, Hiew, etc). Hoje decidi testá-lo e curti bastante. Tá em mega beta, então não tá nem perto de ter pacote disponível nos repositórios oficiais das distros Linux, mas consegui compilar e neste artigo vou dar as instruções, que podem variar em cada ambiente, até porque o poke está em constante desenvolvimento. Usei um ambiente Debian testing aqui. Instalando as dependências A dependência mais chatinha de instalar foi a gettext, porque o pacote pronto dela não foi suficiente. Então tive que clonar e compilar: $ sudo apt install perf fp-compiler fp-units-fcl groff build-essential git $ git clone https://git.savannah.gnu.org/git/gettext.git $ cd gettext $ ./gitsub.sh pull $ ./autogen.sh $ ./configure $ make $ sudo make install Com a gettext instalada, agora podemos partir para as demais dependências do poke: $ sudo apt install build-essential libgc-dev libreadline-dev flex libnbd-dev help2man texinfo Só então podemos seguir para a compilação do poke. Compilando o poke $ git clone git://git.savannah.gnu.org/poke.git $ cd poke $ ./bootstrap $ ./configure $ make $ sudo make install Criando links para as bibliotecas Como instalei as bibliotecas do poke em /usr/local e o meu sistema não tinha este diretório configurado para que o loader busque as bibliotecas, precisei criar dois links para elas em /usr/lib: $ sudo ln -s /usr/local/lib/libpoke.so.0 /usr/lib/libpoke.so.0 $ sudo ln -s /usr/local/lib/libtextstyle.so.0 /usr/lib/libtextstyle.so.0 Sei que há outras maneiras de resolver isso, mas fiz assim pra acelerar, afinal eu queria mexer no poke logo! 🤪 Abrindo um binário PE no poke Baixei o executável do PuTTY para brincar um pouco e abri assim: $ poke putty.exe _____ ---' __\_______ ______) GNU poke 0.1-beta __) __) ---._______) Copyright (C) 2019, 2020 Jose E. Marchesi. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Powered by Jitter 0.9.212. Perpetrated by Jose E. Marchesi. hserver listening in port 47209. For help, type ".help". Type ".exit" to leave the program. (poke) Gerenciando os arquivos abertos O poke permite trabalhar com múltiplos arquivos de uma vez. Você pode ver a lista de arquivos abertos com o seguinte comando: (poke) .info ios Id Mode Size Name * #0 rw 0x0010b990#B ./putty.exe ios signifca "IO Spaces". Não tem nada a ver com o SO da Cisco ou com o da Apple. hehe Se quiser abrir outro arquivo, pode usar o comando .file <arquivo> e aí pode selecionar em qual você quer trabalhar com o comando .ios #n onde n é o número que identifica o arquivo, mas vou seguir o artigo com somente um arquivo aberto mesmo, então só teremos a tag #0. Dumpando dados Um dos principais comandos do poke é o dump (perceba este não começa com um ponto) que basicamente visualiza o conteúdo do arquivo, mas este tem várias opções. Vamos à mais básica: A primeira linha na saída acima é só uma régua pra te ajudar a encontrar os bytes. Fiz questão de colar uma captura de tela aí acima pra você ver que o poke colore a saída, mas nos exemplos seguintes vou colar a saída em texto pelo bem da sua largura de banda. 🙂 Por padrão, o dump exibe 128 bytes do arquivo, começando do seu primeiro byte. O número de bytes pode ser alterado na própria linha de comando: (poke) dump :size 64#B 76543210 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789ABCDEF 00000000: 4d5a 7800 0100 0000 0400 0000 0000 0000 MZx............. 00000010: 0000 0000 0000 0000 4000 0000 0000 0000 ........@....... 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 7800 0000 ............x... A sintaxe pode parecer um pouco estranha no início, mas você acostuma rápido. O sufixo #B diz que a unidade usada é bytes. Você pode testar outros valores como 2#KB ou 1#MB por exemplo. 😉 Dumpando a partir de posições específicas Para dumpar a partir de uma posição específica, podemos usar a opção :from do comando dump: (poke) dump :from 0x30#B :size 32#B 76543210 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789ABCDEF 00000030: 0000 0000 0000 0000 0000 0000 7800 0000 ............x... 00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 7468 ........!..L.!th No comando acima eu pedi para o poke me mostrar 32 bytes a partir da posição 0x30. Seria o equivalente a fazer hd -n 32 -s 0x30 <arquivo>. O poke mantém um ponteiro de leitura no arquivo, por isso se você comandar somente dump novamente, o dump ocorrerá a partir da última posição lida (no caso, 0x30). Se quiser voltar o ponteiro para a posição zero, é a mesma sintaxe: dump :from 0#B. Interpretando dados O dump sempre te entrega uma saída em hexadecimal, mas e se quisermos interpretar os dados e exibi-los de maneiras diferentes? Para isso a gente larga de mão o comando dump e começa a operar com o jeito do poke de ler e interpretar especificamente, assim: (poke) byte @ 0#B 77UB O sufixo UB significa Unsigned Byte. Se eu quiser a saída em hexa por exemplo, basta eu setar a variável obase (output base): (poke) .set obase 16 (poke) byte @ 0#B 0x4dUB Eu poderia querer ler 2 bytes. Tranquilo: (poke) byte[2] @ 0#B [0x4dUB,0x5aUB] Posso interpretar o conteúdo como número também: (poke) uint16 @ 0#B 0x4d5aUH O prefixo UH significa Unsigned Half (Integer). Perceba que o poke sabe que um uint16 tem 2 bytes e por isso os lê sem a necessidade que especifiquemos o número de bytes a serem lidos. À essa altura você já sacou que equivalentes aos tipos padrão da linguagem C (da inttypes.h na real) estão disponíveis para uso né? Fique à vontade pra testar off64, int64, int32, etc. Lendo strings Além dos tipos numéricos, o poke tem o tipo string, onde ele lê até encontrar um nullbyte: (poke) dump 76543210 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789ABCDEF 00000000: 4d5a 7800 0100 0000 0400 0000 0000 0000 MZx............. 00000010: 0000 0000 0000 0000 4000 0000 0000 0000 ........@....... 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 7800 0000 ............x... 00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th 00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno 00000060: 7420 6265 2072 756e 2069 6e20 444f 5320 t be run in DOS 00000070: 6d6f 6465 2e24 0000 5045 0000 4c01 0700 mode.$..PE..L... (poke) string @ 0x4d#B "!This program cannot be run in DOS mode.$" Patch simples Vamos fazer um patch simples: alterar o "T" desta string acima de maiúsculo para minúsculo. Basicamente é só colocar à esquerda o jeito que acessamos uma determinada posição do arquivo e igualar ao que a gente quer. Sabendo que para converter maiúsculo para minúsculo na tabela ASCII basta somar 32 (0x20), podemos fazer: (poke) byte @ 0x4e#B = 0x74 Perceba que fui na posição 0x4e, porque na 0x4d temos o '!' e não o 'T'. Só pra checar se funcionou: (poke) string @ 0x4d#B "!this program cannot be run in DOS mode.$" (poke) Legal né? Mas dá pra ficar melhor. O poke suporta char, então podemos meter direto: (poke) char @ 0x4e#B = 't' (poke) string @ 0x4d#B "!this program cannot be run in DOS mode.$" Por hora é só. Fica ligado aí que postarei a parte 2 em breve, onde vou mostrar mais recursos do poke que tô achando bem úteis para engenharia reversa. Até lá! 😎
  24. Ah, isso é a sintaxe do IDA. É exatamente a mesma coisa: jmp dword ptr ds:[edi*4+100011] // OllyDbg, x64dbg, etc jmp dword_100011a[edi * 4] // IDA Ambas são interpretações de um salto indireto FF 24. Pode checar com o radare2 ó: $ rasm2 -ax86 -d ff24bd11001000 jmp dword [edi*4 + 0x100011] FF 24 é o jump indireto. BD é o EDI*4 e o resto é o endereço do array. Percebe que o radare já não usa o "ptr" que o Olly e o x64dbg usam. Pode ser confuso mesmo, mas é tudo a mesma coisa. É que assim, no geral as pessoas simplificam em sintaxes Intel e AT&T, mas na prática os disassemblers fazem "pequenos patches" nelas. Só pra você ver o quanto varia: IDEAL (Borland): JMP [DWORD DS:EDI*4+0x100011] HLA (High Level Assembly): JMP ([TYPE DWORD DS:EDI*4+0x100011]) AT&T: jmp *%ds: 100011(,%edi,4) Sem contar as opções que os disassemblers possuem como omitir o segmento (aí não vai ter mais o ds:), disassemblar em maiúsculo ou minúsculo, com ou sem o "0x", etc. E tem mais: quando estamos escrevendo código-fonte em Assembly, mudam detalhes também. No MASM por exemplo se o seu array se chama "arr", vai ser arr[edi * 4] (como o IDA mostra). Mas aí tem que ver como é no TASM, YASM, NASM, BASM... Enfim, no final, sabendo que as diferenças de sintaxe existem, compare sempre os opcodes, assim você vai ter certeza do que tá rolando. 😉 Abraço!
×
×
  • Create New...