Apoiador Nibble Fabiano Furtado Postado Dezembro 5, 2018 em 19:04 Apoiador Nibble Compartilhar Postado Dezembro 5, 2018 em 19:04 Pessoal, estou estudando alguns tópicos do livro "Reversing: Secrets of Reverse Engineering" do Eldad Eilam, ano 2005, mais espeficificamente o capítulo "10- Antireversing Techniques". Neste capítulo há muito conteúdo, mas a dúvida é sobre o "Garbage Byte", técnica onde se coloca bytes em posições estratégias do binário para dificultar o disassembly, combinado com os métodos que os disassemblers utilizam para fazer o reversing de forma correta. O livro apresenta duas técnicas chamadas de Linear Sweep e Recursive Traversal. Segundo o autor, este exemplo do livro... _asm { mov eax, 2 cmp eax, 3 je Junk mov eax, After jmp eax Junk: _emit 0xf After: mov eax, [SomeVariable] push eax call AFunction } ... confunde os disassemblers, independentemente da técnica utilizada (Linear Sweep ou Recursive Traversal). "A razão pela qual esse truque funciona é bem trivial - porque o disassembler não tem idéia de que a sequencia mov eax, After, jmp eax é equivalente a jmp After...". Neste exemplo temos 2 "pegadinhas" para os disassemblers. A primeira é um jump condicional, que sempre será incondicional pois a comparação feita sempre será com constantes (2 e 3). A segunda é esse conjunto "mov eax, After, jmp eax", já citado anteriormente. Bem, implementar uma nova técnica de disassembler mais inteligente é muito complicado? Pelo menos uma técnica onde se consiga avaliar os saltos baseados em constantes, como no exemplo acima. Acredito que seja complexo pois este livro é de 2005 e até hoje os disassemblers não a implementaram. Alguém já teve alguma experiência com isso? Saberia me apontar a dificuldade em se implementar tal técnica? Em tempo, sugiro a leitura e estudo deste livro. Estou achando excelente o seu conteúdo. Desde já, agradeço. Link para o comentário Compartilhar em outros sites More sharing options...
cpuodzius Postado Dezembro 10, 2018 em 21:42 Compartilhar Postado Dezembro 10, 2018 em 21:42 Talvez disassemblers modernos consigam ligar com casos simples como esse (honestamente, não tentei verificar), mas o que está por trás desse exemplo é algo mais um pouco mais intrincado se resolver de maneira genérica. Trata-se do que é conhecido como predicado opaco. Predicados opacos são condições, nesse caso (2 != 3) que sempre levarão ao mesmo resultado. Se pensarmos, ao invés desse caso, por que não calcularmos x² + 2xy + y² = (x + y)²? Ou algo ainda menos evidente... fato é que predicados opacos são cada vez usados e um assunto "quente" para se pesquisar (ou pelo menos é a impressão que derivo do microcosmo que frequento, em que há pessoas que se dedicam exclusivamente a tentar resolver esse problema). Fiz uma leitura diagonal bem ligeira desse artigo e me parece ao menos descrever bem o problema. Prometo tentar lê-lo com mais calma quando tiver mais tempo e voltar para comentar. ✌️ Link para o comentário Compartilhar em outros sites More sharing options...
Apoiador Nibble Fabiano Furtado Postado Dezembro 11, 2018 em 13:42 Autor Apoiador Nibble Compartilhar Postado Dezembro 11, 2018 em 13:42 cpuodzius, agora entendi a complexidade... vou dar uma lida no artigo indicado. Agradeço pelo retorno. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.