Jump to content
Fabiano Furtado

Linear Sweep e Recursive Traversal com "Garbage Byte": é possivel melhorar estas técnicas?

Recommended Posts

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.

  • Curtir 1

Share this post


Link to post
Share on other sites

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. ✌️

Edited by cpuodzius
  • Curtir 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...