Ir para conteúdo

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


Fabiano Furtado

Posts Recomendados

  • Apoiador Nibble

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

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

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...