Jump to content

Fernando Mercês

Administradores
  • Content Count

    681
  • Joined

  • Last visited

Everything posted by Fernando Mercês

  1. Fala galera! Estamos no meio do curso de Eng. Reversa II, que tá rolando em São Paulo. Numa das análises de um binário de 32-bits surgiu novamente uma "comparação" com a instrução TEST, ao invés da CMP e novamente esqueci da diferença, mas achei um tópico num outro fórum que deixou claro e decidi escrever aqui pra nunca mais esquecer. rs Acontece que a TEST faz um E bit-a-bit (bitwise AND) entre os operandos, o que é completamente da CMP que compara subtraindo-os. Pra entender melhor, suponha que EAX = 3 (11 em binário). Se fizermos: TEST EAX, 3 O cálculo feito é um AND de 11 com 11, resultando em 11, mas este resultado é descartado. No entanto, as flags ZF, PF e SF são afetadas de acordo com o seguinte pseudo-código (retirei do manual da Intel): A instrução que vimos estava assim: TEST EAX, EAX Como isso vai fazer um AND do valor de EAX com ele mesmo, a ZF vai ser setada somente se o valor de EAX for zero (todos os seus bits zerados). Então isso "dá no mesmo" que fazer: CMP EAX, 0 É isso. Quis registrar aqui para usar como referência futura. Abraços e bons estudos!
  2. Muito legal, Leandro. Tem muito pouca material sobre o formato PE em Português, principalmente atualizado. É muito bom te ver desenvolvendo o estudo, programando em C, enfim, estudando ER em geral. Vamos juntos! ;-)
  3. Essa vaga é, na minha opinião, um bom exemplo de como low level paga bem e tá mais próximo de nós que imaginamos: --- Este profissional ira fazer a manutenção e desenvolvimento (C++) de novos sistemas na empresa. Requisitos: + Experiência em Linux Application Programming C/C++ + Linux TCP/IP programming + Boost + Sockets + Multithread + Inglês técnico. Atenção: Necessário flexibilidade para ideias diferentes das convencionais e padronizadas do mercado. Salário: até R$10.000 (Dependendo do conhecimento do candidato) APENAS Pessoa Jurídica (PJ) - Projeto FIXO (tempo indeterminado) Endereço: SP - Zona Leste - Vila Formosa Contato: https://groups.google.com/forum/#!topic/ccppbrasil/lXEF9iJiEBA
  4. A tarefa não é difícil, mas decidi mostrar como faço. :-) A maneira rápida quando tenho shell: $ file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a0823e17cafbe5b2296346216445566840fdfd88, stripped Programaticamente em C (8 bytes significam 64 bits). $ echo 'main(){printf("%d\n", sizeof(void *));}' | tcc -run - 8 Só pra ver se o processador suporta: $ grep --color -w lm /proc/cpuinfo O clássico: $ uname -a Linux linux64 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u3 (2017-08-15) x86_64 GNU/Linux Ou pelo nome dos arquivos do kernel: $ ls /boot config-3.16.0-4-amd64 grub initrd.img-3.16.0-4-amd64 System.map-3.16.0-4-amd64 vmlinuz-3.16.0-4-amd64 Tem outra maneira de fazer? :-)
  5. Ah sim. Mas hoje em dia tem watch na maioria dos servers né? É que eu lembro dum brother que fazia isso direto num Solaris (que não tinha watch). se hoje eu pegasse um servidor assim, instalaria as ferramentas ao invés de ficar me matando. rs Fiz isso no Mac por exemplo, aí tenho o conjunto GNU e aí é só usar gstrings, ggrep, etc. Abraço!
  6. Que legal. Um TODO que tenho é reescrever meus códigos usando a instrução syscall, que é mais atual que a int 0x80. Já pensou nisso? Seria legal estudar isso aqui. :-) Abraço!
  7. Oi Eduardo, Sinta-se livre para criá-lo! Acho que no fórum de Programação ele cai bem! Depois que criar eu o fixo e aí ele ficará sempre no topo, o que acha? :-) Abraço!
  8. until
    Estreia da sequência do treinamento de Engenharia Reversa I (antigo "Reversing From Scratch") em São Paulo! Para mais informações e inscrições, acesse o tópico do treinamento.
  9. Eu postei o evento do FLARE-on. Acho que é um bom começo!
  10. É, reconheço que certas decisões são difíceis ao escrever, porque realmente pode confundir. Entendo perfeitamente. Foi assim que fiz o curso também, e as sugestões de melhorias ficaram nos comentários do vídeo, como estão ficando aqui nos comentários do seu tópico. :-) Valeu!
  11. Que legal, @Eduardo Bittencourt! O fórum é pra isso mesmo! Acho fantástico quando alguém perde o medo e posta! haha Olha, eu não sou especialista no assunto mas, a meu ver, tem coisas que podem ser elevadas de nível, exatamente como o Frederico fez com as minhas aulas no canal. Mas são detalhes, tipo quando você fala que o ponteiro aponta pro endereço de uma variável, mas na verdade pode apontar pra qualquer lugar. Claro, normalmente tem um dado lá. rsrs Mas enfim, como falei, são pequenos detalhes que a revisão do Frederico me ajudou a ficar mais esperto sobre! Como você pediu feedback, vou listar aqui: Ponteiros são variáveis que contém um endereço de memória. É melhor usar o %p ao imprimir endereços de memória, porque ele já adapta pra arquitetura (%#x ou %#lx). Olha a confusão (em 64-bits): $ echo 'main(){ int x; printf("%x\n%p\n", &x, &x); }' | tcc -run - 4fce29ac 0x7fff4fce29ac Pro size_t, usa o %zu por conta do tamanho (o Frederico fala sobre isso nos comentários no canal) A memset() é pra escrever em memória. No código do item 6, aquele free() não vai rolar porque você incrementou o endereço do ponteiro. Uma saída pra isso seria usando um ponteiro auxiliar, pra guardar o primeiro endereço antes de incrementar (já que você usou isso pra iterar por ele): int main(void) { char *ptr = malloc(11); // Aloca 11 bytes, 10 bytes para a string, e 1 byte a mais para o nullbyte strcpy(ptr, "aaaaaaaaab"); char *aux = ptr; while (*ptr != 'b') { // percorre o loop até achar a letra b memset(ptr, 'x', sizeof(char)); // escreve o byte 'x' no endereço de memória apontado por ptr (a escrita rola sizeof(char) vezes - no caso aqui é 1) ptr++; // incrementa sizeof(char) bytes no endereço para o qual o ponteiro aponta (seu valor) } puts(aux); free(aux); return 0; } Ou fazer o loop com for. Mas no caso dessa função (colocar 'x' até encontrar 'b'), como é um caractere só, não precisa da memset(): while (*ptr != 'b') { *ptr = 'x'; // coloca o 'x' no endereço de memória apontado por ptr ptr++; // incrementa ptr, então ele vai agora apontar para a próxima letra } Dá pra fazer tudo numa linha só também, graças à magia negra precedência de operadores: while (*ptr != 'b') *ptr++ = 'x'; Mas de novo, tá muito bom o texto. O assunto parece complicado e assusta a galera, mas você tratou de boa. Isso é muito maneiro! Grande abraço!
  12. Galera da Microsoft acabade lançar um preview da nova versão do WinDbg. Confesso que nunca usei este debugger (simplesmente não me falta nada no OllyDbg), mas provavelmente deveria. :-) As novidades, pelo que vi, são basicamente na usabilidade. https://blogs.msdn.microsoft.com/windbg/2017/08/28/new-windbg-available-in-preview/
  13. Que maneiro, @Cabral! É interessante notar que nos dias de hoje conteúdo não falta né? Mas tempo e foco... hehehe Abraço!
  14. Fernando Mercês

    FLARE-on Challenge 4

    until
    Esse é o quarto CTF consecutivo de engenharia reversa, organizado pelo pessoal do FLARE Labs. Serão 12 desafios de ER este ano, com foco em Windows, mas também envolve Linux, Android e até Arduino! Mais informações em http://flare-on.com
  15. Acabamos de subir um vídeo sobre ele no Papo Binário: No vídeo comentaram que o autor usou o comando .shellcode e .read (pra ler da stack no caso, exatamente como mostro no vídeo) pra resolver um desafio de um CTF.
  16. A única conferência de segurança da Bahia chega a mais uma edição, imperdível pra quem é da área e estará pelo Nordeste do Brasil em Novembro! Corre porque os ingressos são limitados a 50 participantes! Mais informações em https://nullbyte-con.org
  17. Hoje eu vi os slides de uma palestra que rolou no último encontro da galera do C/C++ Brasil sobre o gcc. Tem muita coisa interessante, mas curti principalmente conhecer as variantes das opções de proteção de pilha. É meio raro encontrar material em Português nesse nível, então decidi compartilhar aqui o trecho em questão: O Gianni Rossi, autor da palestra, compartilhou os slides completos!
  18. Problema nenhum, brother. To testando porque tenho interesse mesmo. Pode certamente ser utilizado para fins maliciosos, se funcionar. Como você testou? Aqui não rolou localmente, mesmo com hxxp.
  19. Precisava deixar essa dica de um jogo que tenho jogado uns 5 min. por dia, todo dia, chamado Elevate. Trata-se de um brain trainer mas é preciso saber (ou estar estudando) inglês, único idioma disponível até o momento. Tem jogos de lógica, fala, escrita, matemática, todos muito bons! Não é um app para aprender inglês e sim melhorar as técnicas de comunicação e raciocínio. É de graça para jogar uma vez por dia até 3 treinos diferentes. Eu to curtindo muito e já tô quase aprendendo a fazer conta de dividir por 2 dígitos haha! Uma alternativa é o Luminosity e este sim tem em Português mas não joguei pra ver como é (não consigo me livrar do Elevate! haha). Abraços!
  20. Interessante, mas eu abri no browser um arquivo HTML com o seguinte conteúdo, cliquei no link e deu erro, como "esperado": <html> <body> <a href="httx://www.google.com">Google</a> </body> </html> O Safari mostra um erro e o Chrome estranhamente não faz nada (nem segue o link). Fiz algo errado? Abraços!
  21. Que dúvida interessante. Eu não sou "o desenvolvedor", mas imagino que a melhor forma seria o sistema 2 ter um plugin que puxasse os dados. Se tiver uma interface pra criar plugins nele, seria legal. Caso não tenha, então talvez seja mais rápido criar um script que conecte no banco do sistema 1 (SQL Server no seu caso) e insira as informações do jeito que você precisa no banco do sistema 2 (MySQL server). Para isso você vai precisar: Entender como os dados estão organizados no SQL Server do sistema 1. Entender como uma tarefa (ou o que você quer criar) é criado pelo sistema 2 no MySQL. Criar um script/programa que leia os dados necessários no SQL Server do sistema 1 e insira os dados no MySQL do sistema 2. Se topar o desafio de fazer (e, na boa, se isso é algo do seu trabalho eu dou a maior força pra você fazer e mostrar know-how), eu sugiro usar a filosofia do baby steps do XP (eXtreme Programming), que basicamente consiste em dividir seu problema em vários problemas menores, resolver um, testar e só passar para outro quando este estiver funcionando. Por exemplo: Conectar no SQL Server. Fazer um SELECT lá e exibir o resultado na tela. Filtrar seu SELECT para pegar o que você quer e imprimir o resultado na tela. Conectar no MySQL. Inserir uma tarefa. Transformar o que vem do SQL Server numa tarefa (parsing) e imprimir na tela. Inserir a tarefa no MySQL, ao invés de imprimir na tela. Como disse, não sou a melhor pessoa pra isso. Outros membros podem sugerir soluções muito melhores, mas eu faria meio que isso se fosse o meu caso, pelo menos com o conhecimento que tenho sobre o assunto atualmente, que é pouco. Tentaria Python ou talvez C# (sei lá, em ambiente Windows gosto de usar as coisas da própria Microsoft, que geralmente funcionam bem). Abraço!
  22. Ah, não me venha com gas e AT&T syntax :-D Acho que o pior é usar a int 0x80. Queria fazer uma versão nova. =)
  23. Fernando Mercês

    WinREPL

    Conheci hoje esse debugger que achei interessante pra simular código no Windows. Achei interessante a abordagem se o objetivo é estudar, simular algo ou rodar um shellcode (claro, nada que não dê pra fazer com o OllyDbg por exemplo). Ele não é pra debugar processos, mas pra assemblar diretamente o que precisar ser executado. No exemplo só fiz uma continha envolvendo os registradores EAX e EBX. Tem umas funções legais tipo alocar memória (comando .allocate) e pegar os enedereços de exports da kernel32.dll, mas não achei muito útil visto que teríamos que criar os argumentos "na mão" e não suporta inserir strings tipo "texto", então teria que ser os bytes hexa dos ASCII equivalentes. Mas de qualquer forma, é melhor que estudar Assembly pelo DEBUG do DOS! haha Alguma outra ideia do que fazer com ele? https://github.com/zerosum0x0/WinREPL
×
×
  • Create New...