Jump to content

Fernando Mercês

Administrators
  • Posts

    1,629
  • Joined

  • Last visited

  • Days Won

    216

Everything posted by Fernando Mercês

  1. Olá! Por favor, leia e adapte seu tópico: Obrigado!
  2. @edummoreno se entendi bem, você quer copiar todos os arquivos de uma pasta para uma pasta um nível acima. Neste caso, não precisa descobrir os nomes de arquivos com força bruta (tentar todas as possibilidades até acertar), nem mesmo entrar na pasta. A partir da pasta destino dos arquivos, você faz (em batch): copy pasta1\*.* . copy pasta2\*.* . O “asterisco ponto asterisco” expande para todos os arquivos do diretório. Já o "ponto" significa "diretório atual". Isso resolve seu problema? Abraço!
  3. Salve, pessoal! Pra quem viu a palestra na BHack hoje e quiser os slides, aqui está. Quem não viu e se interessar pelos slides também, aqui está também! kkkk Abraço! Dominando_ER_Linux_BHack.pdf
      • 2
      • Curtir
  4. Opa. Um intervalo são dois números, certo? Por que você tá lendo três números? Não ficou claro pra mim. Abraço, Fernando
  5. O endereço MAC da máquina não. No entanto, as seguintes informações podem estar disponíveis, dependendo do formato de exeuctável em uso e das opções configuradas no compilador e linker: Caminho completo de onde os arquivos de código-fonte estão armazenados, o que pode conter o nome de usuário da máquina. Versão do compilador e do linker utilizado, seja em texto puro, ou seja por padrões que permitam identificação, como os utilizados pelo DIE. Por exemplo, este arquivo contém a lógica que o DIE utiliza para identificar versões do Visual Studio. Data e hora que o arquivo executável foi gerado (somente em PE). Idioma de resources, o que pode sugerir o idioma do Windows de quem compilou o binário (somente em PE). Em tempo, sempre que postar código aqui, use o botão <> para formatar seu código como código. Olha a diferença: Sem formatação: #include <stdio.h> printf("Olá, mundo!\n"); Com formatação: #include <stdio.h> printf("Olá, mundo!\n"); Valeu!
  6. Olá! Bom, tem algumas coisas para serem esclarecidas aí 🙂 Em C, a função strlen() aceita um char* (não um char) como argumento. Este é um ponteiro para um tipo primitivo e é o jeito oficial de se implementar strings em C. Já em C++, a classe std::string é completamente diferente. Para determinar seu tamanho, ela possui uma função (método) length(). Aqui tem um exemplo de como utilizá-la. O trecho de código que você postou declara um array de objetos string com dez elementos (e não uma única string). Sendo assim, cada elemento do seu array pode ser uma string com tamanho diferente. PS.: C++ também trabalha com os tipos primitivos e com C strings. Abraço!
  7. until
    Primeira edição do Tempest Academy Conference! Bem vindo! 😎 Inscrições e mais informações aqui.
  8. A gente montou um guia também. 🙂
  9. until
    11a edição da BHack, em Belo Horizonte. Mais informações em https://www.bhack.com.br.
  10. until
    Treinamento presencial de dois dias em São Paulo/SP. Mais informações aqui.
  11. Situação: você quer estudar engenharia reversa em algum programa, analisar um arquivo suspeito ou dar uma olhada na memória daquele joguinho pra ver se econtra algo. O que você faz? Começa a buscar na internet programas que possam te ajudar. Faz download, descomprime, joga diretório pra lá, arquivo pra cá, configura e a esta altura já quase não tem mais paciência pra começar. Se identificou? 😄 E se alguém pegasse vários programas de análise, colocasse todos juntos num instalador só, de modo que você baixasse um único arquivo e instalasse tudo o que precisa? Não facilitaria? Além disso você poderia baixar uma vez só e instalar em máquinas virtuais sempre que precisar, né? Para estes casos temos o retoolkit, que hoje chega a sua quarta versão, a 2022.10. Além de te oferecer dezenas de ferramentas num único instalador, ele te permite escolher quais ferramentas você quer instalar, como mostra a figura: Nesta versão foram incluídas as ferramentas AutoIt-Ripper, Bazzar (do @anderson_leite), ExtremeDumper, HxD, HyperDbg, OpenHashTab e WinAPI Search. Difícil escolher qual a mais legal, mas o HyperDbg é um debugger novo para Windows, assistido pelo hypervisor (ring -1) para kernel (ring 0) e user land (ring 3). Coisa muito chique, gente! Outro destaque desta edição é o menu de documentação, com vários links úteis no estudo da arte: Os programas mais populares para engenharia reversa no Windows também estão lá, claro! Um bom exemplo é o x64dbg, que já é instalado e configurado com vários plugins: Aproveitando que o retoolkit é nosso, também não perdi a oportunidade de colocar nossas ferramentas lá! Desde a primeira versão ele conta com o manw do @Leandro Fróes e o pev, por exemplo. Listar todas as ferramentas aqui demoraria muito. Mais fácil você baixar, instalar e ver o bicho em ação né? Uma listagem completa das ferramentas disponíveis no kit pode ser acessada aqui. Happy hacking! 😎
  12. Estamos de volta, bem antes do esperado. Agora de servidor novo, com softwares atualizados! Tudo só é possível porque você nos apoia, patrocina ou faz nossos treinamentos. Muito obrigado! 💚
  13. Olá! Considere o seguinte: Inclua a <stdio.h>. Use uma função por linha. Fica melhor pra ler o código. Você não usa nenhuma função da <stdlib.h> nem da <string.h>. Pode remover esses includes. ? A variável flag é testada no while mas não é inicializada antes. Recomendo utilizar do/while, o que vai fazer com que sua condição fique no final. Alternativamente, você pode inicializar a variável flag com 1 na declaração. Você usou a variável aux para contar quantos produtos foram inseridos. O problema é que você a incrementa fora do for. Uma solução rápida é colocar i<4 na condição do for (já que tem um if com break no fim dele) e o incremento da aux logo após a leitura do produto, antes da chamada à printf(). Isso deve ser suficiente para corrigir o programa seguindo a sua lógica. Uma vez corrigido, se quiser saber mais, eu teria outras sugestões. Dá pra resolver a leitura com um loop só ao invés de dois e tem outras melhorias também. Abraço.
  14. Nosso site ficará offline da meia-noite da próxima terça-feira, dia 4 de Outubro, até às 18h do mesmo dia para uma manutenção programada (uma migração de servidor). ? Obrigado por estar conosco! ^^ Um abraço, Fernando
  15. Version 0.2

    13 downloads

    Interface gráfica para o packer MPRESS.
  16. Version 2.19

    13 downloads

    Compressor (packer) de executáveis similar ao FSG e UPX. Por algum motivo o link para download desapareceu do site oficial, por isso vou deixá-lo aqui. Talvez você também queira baixar uma interface gráfica para o MPRESS.
  17. Version 1.7f

    15 downloads

    ImpRec (Imports Reconstructor) foi o mais popular reconstrutor de IAT por mais de uma década e é utilizado com executáveis PE de 32-bits até hoje, apesar de o Scylla ser o padrão atual.
  18. Maria, por favor leia: Aí edita o seu tópico pra se adaptar à essas boas práticas pra gente poder te ajudar. ?
  19. Breno, leia aqui e edite seu tópico de acordo por favor: Do contrário, vai ficar muito complicado te ajudar.
  20. Não consigo imaginar uma forma sem assinatura digital. O Zendesk teria que assinar a mensagem a meu ver, mas não sei se ele faz isso. ?
  21. Que pergunta boa. ? Eu só consigo responder de forma leviana pois tenho zero experiência na programação de compiladores, engines, etc. O que sei é que em JavaScript os arrays são objetos, logo, não são simplesmente tipos primitivos em sequência na memória como em C. Agora a parte que eu acho (por não conhecer os internals do JavaScript): Quando você declara um array em JS, você está criando um objeto (alocando memória para ele) da classe Array. Portanto, provavelmente quando você coloca nele algum elemento, você tá na real chamando um método dessa classe. A diferença é que o programador faz isso sem ver. Por exemplo: frutas = ['melão', 'maçã'] O código acima cria um objeto, uma instância da classe Array. Acredito que seja equivalente ao seguinte (passando os elementos para o método construtor): frutas = Array('melão', 'maçã') Poderia também usar o método push: frutas = Array() frutas.push('melão') frutas.push('maçã') No entanto, é mais comum utilizar a notação como no primeiro código, o que pode dar a ilusão de que o array é similar ao do C, mas não é. Em todos os casos, se você fizer typeof(frutas), vai ver que o retorno é object. Agora, os detalhes internos dessa implementação eu não faço ideia - e também imagino que depende do engine usado, porque poderia ser feito de diferentes maneiras, com diferentes estruturas de dados (listas encadeadas, hashmaps, etc) para armazenar o endereço dos tipos primitivos e objetos que são elementos do array. Aqui tem detalhes da classe Array, mas ainda não responde sua dúvida. Recomendaria você: Implementar, em C, um tipo Array que suporte push e pop de elementos. Pode ser só do tipo int ou só do tipo char* pra ficar mais legal. Você pode usar ponteiro para funções para simular os métodos. Buscar o código-fonte de algum engine de JavaScript pra ver como eles fazem. Certamente vai ser diferente de como você fez, mas o fato de você ter feito o seu próprio "gerenciador de arrays" vai te dar uma solidez no assunto, mesmo que você escolha caminhos pouco otimizados e tal. Isso pelo menos seria o que eu faria se eu quisesse entender isso profundamente, mas pode ser que alguém com conhecimento no assunto ajude mais aqui. De qualquer forma, adoraria ver aqui o teu progresso neste estudo, para todos podermos aprender contigo. ? Um abraço e boa sorte!
  22. Muito obrigado, @Richard Nixon!
  23. No artigo anterior, mostrei como detectar overlays em executáveis PE. Se você não sabe o que é um overlay, é melhor ler o artigo anterior antes de seguir com esse. Hoje vamos incluir os usuários de Linux na brincadeira. 🐧 Vamos então ver como fazemos a mesma coisa para executáveis - na verdade qualquer tipo de object file - ELF. A lógica é a mesma: primeiro, temos que descobrir como calcular o tamanho original de um executável ELF a partir de seus cabeçalhos. Então vamos dar uma olhada no executável do ls aqui, que tem 147176 bytes de tamanho: $ wc -c /bin/ls 147176 /bin/ls Claro que no seu ambiente o tamanho pode ser diferente. Agora vou criar um binário chamado novo que terá a mesma imagem, dale.jpg usada no artigo anterior, como overlay (ou seja, adicionado após o fim do arquivo). Isso pode ser feito com o comando cat, que concatena arquivos: $ cat /bin/ls dale.jpg > novo Perceba que o tamanho do arquivo novo é exatamente a soma dos tamanhos dos arquivos /bin/ls e dale.jpg: $ wc -c /bin/ls dale.jpg 147176 /bin/ls 4347 dale.jpg 151523 total $ wc -c novo 151523 novo Já temos então um ELF com overlay (dados além de seu tamanho original). Detectando overlays Para detectar um overlay no ELF, a lógica é bem similar à que usamos para os executáveis PE. A diferença é que no caso do ELF, existe um campo no cabeçalho que nos dá o offset no arquivo, ou seja, a posição no arquivo em disco, de onde começam os cabeçalhos das seções. Veja com a opção -h do readelf: $ readelf -h novo ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Position-Independent Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x6180 Start of program headers: 64 (bytes into file) Start of section headers: 145256 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 11 Size of section headers: 64 (bytes) Number of section headers: 30 Section header string table index: 29 Como nos binários ELF os cabeçalhos de seção vêm depois de seu conteúdo, é seguro assumir que o tamanho original do arquivo é calculado pela seguinte fórmula: início dos cabeçalhos de seção + tamanho do cabeçalho de seção * número de cabeçalhos de seção A mesma saída do readelf nos mostra o tamanho de cabeçalhos de seção (64) e o número de cabeçalhos de seção (30). Sendo assim, o tamanho original do arquivo é: 145256 + 64 * 30 = 147176 (0x23ee8) Logo, qualquer coisa além do byte 0x23ee7 é overlay. Dá até pra gente extrair o overlay com o dd, usando um block size (bs) do tamanho dele e a opção skip para pular exatamente um bloco: $ dd if=novo of=novo.overlay bs=147176 skip=1 0+1 records in 0+1 records out 4347 bytes (4.3 kB, 4.2 KiB) copied, 0.000570537 s, 7.6 MB/s O overlay extraído tem que ter exatamente o conteúdo de dale.jpg. Seu tamanho e hash comprovam o feito: $ wc -c novo.overlay dale.jpg 4347 novo.overlay 4347 dale.jpg 8694 total $ md5sum dale.jpg novo.overlay 84a33c81345eb161327696a8d305d728 dale.jpg 84a33c81345eb161327696a8d305d728 novo.overlay Dúvidas é só comentar. Bons estudos!
  24. Olá! Tem muitos erros que você precisa corrigir. Vamos por partes, ok? ? Você declara a variável aleatorio e a utiliza para ler a opção digitada pelo usuário, mas antes mesmo que ela assuma qualquer valor, você verifica se seu valor é menor que 1 ou maior que 6 e isso está errado. Você não pode comparar o valor de uma variável com nada antes de inicializá-la com algum valor. Te recomendo: Renomear essa variável para opcao, que faz mais sentido já que ela vai conter a opção digitada pelo usuário. Usar um bloco do...while ao invés de while. Na verdade você pês um do...while dentro de um while, o que também é desncessário neste caso. Tem muitos outros erros, mas é preciso corrigir um por vez. Aplica aí as sugestões no código e responde este tópico com o código atualizado que a gente segue. ? Boa sorte!
×
×
  • Create New...