byte_test是snort规则中对payload进行检测时,很重要的逻辑运算规则选项。该规则选项主要功能是获取指定位置的数据进行数据运算并检测。
规则语法
规则样式
byte_test:<num of bytes>, [!]<operator>, <test value>, <offset> [,relative] [,<endian>][, string, <num type>][, dce][, bitmask <bitmask value>];
参数说明
参数 | 功能说明 |
< num of bytes> | 使用的字节个数 |
<operator> | 1. ! 2. <;>;=;<=;>=;&;^ |
<test value> | 最终比较的预期结果值(可以为十六进制或者十进制数) |
<offset> | 获取内容的位置 |
[relative] | 若有relative修饰则offset是指从上一个content匹配位置之后开始计算,若无relative修饰,则offset是指从待检测的内容开始计算偏移字节数 |
multiplier <mult_value> | 结果值扩大mult_value倍 |
<endian> | big:大端字节序处理 little:小端字节序处理 |
[string, <num_type>] | hex|dec|oct |
[dce] | 使用dcerpc协议决定字节序 |
[bitmask <value>] | 计算的的结果值与上当前的掩码值得到最终结果值(uint64_t) |
功能说明
byte_test的功能就是从payload的指定偏移的offset(offset若有relative修饰,则是当前位置加offset,若无relative修饰,则为payload开始位置偏移offset)位置,取nbytes个字符,按照字符串string或者大端或者小端的形式转换为数值,与上bitmask,并左移bitmask位,然后根据operate指定的比较符与test-value比较值大小,并返回结果
注意:
byte_test中的test-value和offset可以为字符串,则相当于名字,需要在byte_extract或者byte_match的result中定义。
示例规则
为了更好的展示byte_test的用法,当前示例规则为综合性的语法规则。
alert tcp any any -> any any (msg:"byte_test option test!"; seq:100; byte_extract:2,1,test_value,relative,multiplier 6,little,align 2; byte_test:2,=,test_value,18,relative,string,hex,bitmask 0x1010;sid:1011106; rev:1;)