<html>
  <head>
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi all,<br>
    <br>
    We've noticed that using byte_test doesn't seem to advance the
    relative pointer in the way we'd expect and were wondering if this
    was by design behavior or a bug (the docs don't discuss the relative
    concept in any depth as far as I can tell)<br>
    <br>
    Here's a contrived example of what we're noticing<br>
    <br>
    Against this (hex) data - <font size="3">05 64 16 21 AB CD 11 22 CC
      CC AA A1 0D<br>
      We write a rule with the following body (ignore for <font
        size="3">conversation's sake that we can write the <font
          size="3">2nd and 3rd as contents and avoid this whole <font
            size="3">mess</font>)</font></font><br>
    </font><font size="3">Content:"|05 64|";<br>
      byte_test:1,>,7,0, relative;<br>
      byte_test:2,=,0xABCD,2,relative;<br>
      byte_test:1,=,0x0D,10, relative;</font><br>
    <br>
    This rule will fire, but notice that the offsets of the three
    byte_tests are are relative to 0x0564 and not each other. In the
    simple example that's not a big deal, its all fixed offsets so we
    can just adjust our numbers a bit and it all works out. The problem
    is when we'd like to do more complicated things, for example we have
    a signature we want to write which reads two variables from a packet
    at fixed offsets from the header, does a simple calculation on them
    (2a + b + 6) to find the offset of some bytes further down the
    packet.<br>
    <br>
    We had *hoped* to solve this by combining byte_extract and byte_test
    kind of like this:<br>
    byte_extract:1,0,variableA,multiplier 2;<br>
    byte_extract:1,4,variableB;<br>
    byte_test:1, ^, 0xff, 6;<br>
    byte_test:1, ^, 0xff, variableA;<br>
    byte_test:4, >, 0xAABBCCDD, variableB; #our actual test goes here
    at relative offset variableB<br>
    <br>
    The idea being we're taking advantage of the fact that doing a
    logical OR with 0xff is always true so we force the relative pointer
    to where we want it in stages. We want 2A + B + 6, so we move it 6,
    then 2A then B<br>
    <br>
    Any thoughts (or alternative solutions) guys?<br>
    <pre class="moz-signature" cols="72">-- 
Brandon Castel
Vulnerability Researcher

Wurldtech Security Technologies
Suite 1000 - 1090 West Georgia Street
Vancouver, BC V6E 3V7
Canada

Phone: (604) 669 6674 ext 709
Fax: (604) 669 2902
"ARE YOU ACHILLES CERTIFIED?"

This message is intended only for the named recipients.  This message may contain information that is privileged, confidential or exempt from disclosure under applicable law.  Any dissemination or copying of this message by anyone other than a named recipient is strictly prohibited.  If you are not a named recipient or an employee or agent responsible for delivering this message to a named recipient, please notify us immediately by telephone at 604-669-6674, and permanently destroy this message and any copies you may have. Email may not be secure unless properly encrypted.</pre>
  </body>
</html>