-
Posts
1,627 -
Joined
-
Last visited
-
Days Won
214
Content Type
Forums
Courses
News
Articles
Professions
Studying materials
Research
Downloads
Store
Events
Gallery
Everything posted by Fernando Mercês
-
Davi, Dica: ao postar, você pode formatar o seu texto. Se for código, é legal formatar como código clicando no botão <>. Olha a diferença. Sem formatação como código: if (var) var = 10; Com formatação como código (mais realce em C): if (var) var = 10; É bem mais fácil que colar prints. ? O botão fica no editor: Outra dica: você pode editar sua mensagem original. Não precisa responder de novo. ? Abraço!
-
Antes de começar, é necessário explicar o que é um overlay, já que este é um termo genérico empregado em diferentes contextos. Pois bem, na análise de malware o termo diz respeito a quaisquer dados adicionados ao final de um arquivo PE. Aqui, entenda o final do arquivo como o último byte dele. Por exemplo, tomemos o executável write.exe, do Wordpad no Windows 10. No caso aqui, criei uma cópia dele para a área de trabalho, para facilitar. Perceba que ele tem 11264 bytes: C:\Users\admin\Desktop>copy c:\Windows\System32\write.exe . 1 file(s) copied. C:\Users\admin\Desktop>dir write.exe 06/12/2019 18:29 11,264 write.exe 1 File(s) 11,264 bytes Agora vamos adicionar algo ao final do arquivo, ou seja, acrescentar algo, aumentando seu tamanho. Isso pode ser qualquer coisa. No contexto de malware, normalmente se acrescenta outros executáveis ou shellcodes, mas qualquer coisa para o nosso exemplo serve. Usarei uma imagem de 4347 bytes: C:\Users\admin\Desktop>dir dale.jpg 26/08/2022 15:40 4,347 dale.jpg 1 File(s) 4,347 bytes 0 Dir(s) 39,704,485,888 bytes free Apesar de existirem programas criados especificamente para isto chamados de binders, o próprio comando copy consegue adicionar um overlay com a opção /b e o separador +. No exemplo abaixo, crio um arquivo chamado novo.exe, que será formado pelo conteúdo do arquivo write.exe seguido do conteúdo do arquivo dale.jpg: C:\Users\admin\Desktop>copy /b write.exe + dale.jpg novo.exe write.exe dale.jpg 1 file(s) copied. O exectuável novo.exe funciona normalmente, pois possui uma cópia exata do original write.exe logo em seu início e somente depois do último byte é que começa o primeiro byte do arquivo dale.jpg. Se o write.exe possui 11264 bytes de tamanho, significa que seu conteúdo vai do byte 0 ao byte 11263. Depois disso, iniciando no byte 11264, há o conteúdo do dale.jpg, que é considerado um overlay pelas razões já explicadas. Perceba também que o tamanho do novo.exe é exatamente a soma dos tamanhos de write.exe e dale.jpg: C:\Users\admin\Desktop>dir write.exe dale.jpg 06/12/2019 18:29 11,264 write.exe 26/08/2022 15:40 4,347 dale.jpg 2 File(s) 15,611 bytes C:\Users\admin\Desktop>dir novo.exe 26/08/2022 15:44 15,611 novo.exe 1 File(s) 15,611 bytes Detectando overlays Vários softwares detectam a presença de overlays. Por exemplo, ao abrir o novo.exe no DIE, ele detecta o overlay, tornando o botão abaixo clicável: DIE habilita o botão Overlay quando há dados acrescentados num aquivo PE Existe mais de uma forma de detectar a presença de overlays. A mais famosa funciona assim: Busca-se a "última" seção do executável, ou seja, a que vem depois de todas as outras, que naturalmente estará mais perto do fim do arquivo que todas as outras. Uma vez que a última seção seja identificada, anota-se o offset dela no arquivo, ou seja, onde ela começa no arquivo (não é em memória, mas sim no arquivo em disco). O valor anterior é somado com o tamanho dessa seção (também em disco). O resultado é o tamanho original do arquivo. Qualquer coisa a mais no arquivo é considerado overlay. Por exemplo, para o executável novo.exe, vejamos as seções (dá no mesmo aqui olhar no write.exe) com o DIE: Informações das seções do arquivo novo.exe no DIE A seção que tiver o maior valor no campo PointerToRawData de seu cabeçalho é a última. Note que não necessiamente ela será a última seção na lista, mas normalmente é o que acontece. No caso deste binário PE, é a seção .reloc. Sendo assim, para obter o tamanho original do arquivo PE, basta somar o byte no arquivo onde a seção começa (valor de PointerToRawData) com seu tamanho no arquivo (valor de SizeOfRawData). Fazendo a conta: 0x2a00 + 0x200 = 0x2c00 (11264 em decimal) Portanto, qualquer coisa além do byte 0x2bff (que é 0x2c00 - 1) no arquivo é overlay. Exatamente por isso o DIE começa a exibir do byte 0x2c00 se você clicar no botão Overlay: DIE exibindo o overlay Executáveis contendo dados além de seu tamanho original podem levantar suspeitas, mas há usos legítimos para este recurso, como na assinatura digital. No entanto, fica a cargo da pessoa que analisa verificar o que tem no overlay e se o código do arquivo lê algo a partir de lá ou não. Quem usa YARA pode se beneficiar da sua capacidade de detectar overlays que adicionei na versão 3.6.0. Para deixar o assunto ainda mais fácil, gravei um vídeo resumindo e mostrando o que está neste artigo em ação: Bons estudos!
- 2 reviews
-
- 4
-
- engenharia reversa
- análise de malware
-
(and 1 more)
Tagged with:
-
Como encontrar senhas em arquivos MSI Installer?
Fernando Mercês replied to PopEax's topic in General
Bela dica @Zemthos ? Um ponto importante que também pode abrir muitas portas é que o MSI é um OLE2, então todas essas ferramentas funcionam para abri-los e analisá-los. Abraços, pessoal! -
O que é Engenharia Reversa? Engenharia reversa de software é a técnica para entender como um trecho de código funciona sem possuir seu código-fonte. É aplicável em diversas áreas da tecnologia como: Análise de malware Reimplementação de software e protocolos Correção de bugs Análise de vulnerabilidades Adição/Alteração de recursos no software Proteções anti-pirataria Alguns termos e abreviações para a engenharia reversa incluem: RCE (Reverse Code Engineering), RE, e reversing. Como funciona? Quando um programa tradicional é construído, o resultado final é um arquivo executável que possui uma série de instruções em código de máquina para que o processador de determinada arquitetura possa executar. Com ajuda de software específicos, profissionais com conhecimentos dessa linguagem (em nosso caso, Assembly) podem entender como o programa funciona e, assim, estudá-lo ou até fazer alterações no mesmo. O curso Este curso é uma sólida introdução sobre Engenharia Reversa. Nele os estudantes aprendem, desde o zero e com a preocupação de entender o motivo de cada passo, como reverter programas básicos em Windows e Linux, adquirindo assim todo o conhecimento necessário para seguir seus estudos em desafios mais avançados na análise de malware e engenharia reversa de aplicações em geral. Cada tópico prático do curso é acompanhado de um ou mais exercícios para fixação do conteúdo. O que você vai aprender A Engenharia Reversa e Suas Aplicações Falando em Binário e em Hexadecimal Arquivos Arquivos Binários Cadeias de Texto ASCII e UNICODE Arquivos Executáveis Cabeçalhos e Campos Seções e Mapeamento em Memória Carregamento de Programas Introdução ao Assembly x86 Arquiteturas Registradores Instruções Básicas Funções e Pilha Debugging Básico Opcodes, Mnemônicos e Instruções Breakpoints de software e hardware Patching O instrutor @Leandro Fróes é Engenheiro de Pesquisa em Ameaças sênior na Netskope. Autor de vários artigos no portal Mente Binária, Leandro analisa, documenta e estuda técnicas de malwares diariamente há cinco anos! Também é o criador do Curso de Ghidra da Mente Binária e das ferramentas gftrace e manw. Pré-requisitos Lógica de programação Computador próprio com: Placa de rede sem fio (na modalidade presencial). VMware Player ou Pro instalado A VM entregue é para arquitetura Intel, AMD, e compatíveis. Computadores com processadores ARM precisam emular a VM, o que deixa tudo muito lento. Se você só tiver acesso a computadores com processadores ARM, vai precisar criar sua própria VM de Windows. Capacidade para rodar uma VM de 4 GB de RAM e 60 GB de disco Última versão do Zoom (na modalidade online) Próximas turmas 23 de 24 de Novembro de 2024 (online)
-
Isso seria considerado uma falha de segurança?
Fernando Mercês replied to Sherlock5063's topic in Pentest
Se forem válidos, é informação sensível. Pode até ser encarado como vulnerabilidade, mas possivelmente de baixo impacto. E não é de código em si né... Enfim, discutível. ? -
https://stniiomyjliimcgkvdszvgen3eaaoz55hreqqx6o77yvmpwt7gklffqd.onion/ Boa sorte. Espero que consigam recuperar sem precisar pagar. :( Valeu.
- 1 reply
-
- 1
-
Criar uma TAD de uma turma de alunos em dev c++
Fernando Mercês replied to Jogos Inteligentes's topic in C/C++
Opa, dá uma olhada antes: Valeu! -
Botões para formatar mensagens nos fórums somem ou não funcionam
Fernando Mercês replied to avique's topic in Speak to us!
Olá. Valeu por avisar. Não é um erro, é o comportamento padrão do editor de oferecer só os botões básicos em telas menores (celular, etc). No entanto, considerando que nosso conteúdo é técnico e muitas vezes terá código, pus o botão de código para todas as telas. ? Markdown foi um teste. Já desativei. Valeu!- 1 reply
-
- 1
-
[Ajuda] Programa que mostre a maior e menor nota
Fernando Mercês replied to balla.us's topic in C/C++
Olá. Não entendi sua dúvida. O que você quer exatamente? Valeu! -
Opa, se você precisar dos números que leu fora do loop que tá lendo, vai precisar colocá-los num array. ? Outra dica: por favor, indente seu código e use o botão se inserir código aqui do fórum. Olha a diferença: Sem indentação, nem formatação: for(i=1;i<=10;i++) { printf("\n%d\t%.2f",i,n); } m=t/u; sleep(2); return 0; Indentado e formatado como código: for(i=1;i<=10;i++) { printf("\n%d\t%.2f",i,n); } m=t/u; sleep(2); return 0; Fica bem melhor pra gente ler. ? Um abraço.
-
Dúvidas sobre alocação de memória e diretivas DB, DW, DD, DQ,...
Fernando Mercês replied to Pedro Otavio's topic in Assembly
Opa, tudo bem? Muito boas suas perguntas. ? Essas diretivas definem dados. Por exemplo, da documentação do FASM: Mas elas não estão limitadas apenas ao tamanho de um dado. Você também pode definir vários dados, que serão armazenados em sequência (conceito de array). Por exemplo, a seguinte diretiva define três bytes em sequência e associa o rótulo dados a ele (essa associação é como o nome de uma variável: só existe no código-fonte): dados: db 0x41, 0x42, 0x43 Outra sintaxe possível para definição dos mesmos três bytes é: dados: db 'A', 'B', 'C' Ou ainda: dados: db 'ABC' Ou: dados: db 'AB', 'C' Ou: dados: db 'AB', 0x43 E por aí vai... É o mesmo que, em C, fazer algo como: char *dados = "ABC"; Ou seja, o rótulo em Assembly será somente o endereço no segmento de dados do programa. Abraço! -
Oi Vinicius, tudo bem? Olha, se você não sabe começar, acho que o ideal então é eu te recomendar leituras. Aqui vai: Estrutura de Dados e Algoritmos em C - https://www.cos.ufrj.br/~rfarias/cos121/ Você vai precisar estudar bastante para poder concluir este trabalho. O quanto você sabe de C? Variáveis, funções, ponteiros, isso você já sabe? Se não souber, vai precisar de um material básico de programação também. Abraço!
- 1 reply
-
- 1
-
Caramba. Olha, eu não sei se é intencional, mas a descoberta é importante. Não é incomum fabricantes colocarem backdoors em seus dispositivos. Em geral a hipótese mais comentada é a de espionagem estatal, mas nessa seara tudo é muito difícil de se afirmar, a não ser quando ocorrem vazementos tipo o que o Snowde fez. ?
-
Parece bom sim. Só o system("pause") aí que só funciona no Windows (ou DOS hehe), mas acho que a ideia do trabalho é testar sua lógica, então tá tudo certo. Parabéns!
-
You will never find my command without debugging ?
-
Oi Antonio, tudo bem? Dá uma olhada aqui antes: Abraço, Fernando
-
Pra facilitar seus testes, você pode escrever um arquivo texto com todas as entradas para o programa e depois só redirecionar a entrada ao executar seu programa. Por exemplo, o arquivo anexo pode ser usado da seguinte maneira no Prompt de Comando (no Windows) ou no shell do Linux: No examplo do arquivo anexo, ele vai criar: Produto de código 1. Produto de código 2. Cliente de código 1. Cliente de código 2. Cliente de código 3. Cliente de código 4. Venda para o cliente de código 2 do produto de código 1 de 5 unidades a 2.50 cada. Venda para o cliente de código 1 do produto de código 4 de 3 unidades a 5.00 cada. Venda para o cliente de código 1 do produto de código 2 de 1 unidade a 3.00. Ou seja, é o mesmo que você digitar tudo isso, só que não precisar digitar toda hora. ? Valeu. entrada.txt
-
Opa, tudo bem? Para nos ajudar, pode editar seu tópico e formatar a parte do código como código? É o botãozinho <> no editor. ? Eu achei a lógica meio complexa, mas te recomendo examinar o valor da variável soma na iteração do loop na função mais_vendido. Se você souber colocar breakpoint de depurar, ótimo. Se não, pode usar um: printf("%f\n", soma); Bom, acredito que o problema esteja na seguinte parte: if(soma>mais_vendido){ mais_vendido=produtos[b]; } Aí você está comparando soma (que tem o total faturado por todas as vendas de determinado produto) com o código do produto. Na real você precisa armazenar quanto um produto vendeu e comparar soma com esta nova variável. Boa sorte!
-
Montar uma máquina virtual para analisar malware no Windows pode ser bastante demorado devido à quantidade de ferramentas que precisamos baixar e configurar. Mesmo existindo soluções que as baixam automaticamente, a banda de internet necessária pode ser bem grande, já que algums programas possuem muitos gigabytes. Pensando em otimizar este tempo, criamos o retoolkit, um conjunto de ferramentas pré-configurado que você baixa uma vez e usa sempre, em quantas máquinas virtuais quiser. A lista de ferramentas é grande, por isso criamos uma wiki no respositório do projeto no Github falando sobre cada uma delas, inclusive com exemplos de uso. Além de acelerar o setup de uma VM nova, você pode utilizar o retoolkit simplesmente para conhecer mais sobre algumas ferramentas utilizadas na área.