Supporter - Nibble Fabiano Furtado Posted December 5, 2018 at 07:04 PM Supporter - Nibble Share Posted December 5, 2018 at 07:04 PM 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 to comment Share on other sites More sharing options...
cpuodzius Posted December 10, 2018 at 09:42 PM Share Posted December 10, 2018 at 09:42 PM 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 to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted December 11, 2018 at 01:42 PM Author Supporter - Nibble Share Posted December 11, 2018 at 01:42 PM cpuodzius, agora entendi a complexidade... vou dar uma lida no artigo indicado. Agradeço pelo retorno. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.