[Oisf-devel] lua (jit) script keyword

Victor Julien victor at inliniac.net
Fri Sep 7 20:35:57 UTC 2012


On 09/07/2012 10:07 PM, Martin Holste wrote:
> That is awesome, great idea!

What, you mean you get excited by the idea of generating alerts (from a
script) for each IPv4 packet? :-P

> On Fri, Sep 7, 2012 at 12:55 PM, Victor Julien <victor at inliniac.net> wrote:
>> On 09/07/2012 07:39 PM, Victor Julien wrote:
>>> On 09/07/2012 06:52 PM, Chris Wakelin wrote:
>>>> I've had a quick look at this, but I've never done anything in Lua, so
>>>> it may take me a while to write a useful rule using it :)
>>>>
>>>> One quick question though; a deficiency in using PCRE is coping with
>>>> randomly XOR-ed binaries. I'd quite like a rule that could spot them by
>>>> say XOR-ing every 5th byte for 2n bytes to spot the Zelix obfuscator as
>>>> used in Blackhole jars (though the zip compression may make this
>>>> infeasible) or every 2nd byte to spot 2-byte XOR-ers.
>>>>
>>>> However, there aren't any bitwise operators in Lua 5.1, though there is
>>>> a "BitOp" extension (bitop.luajit.org). Would this work in Suricata?
>>>
>>> Appears so, ya :) The below does nothing useful, but it does appear to
>>> actually right shift as instructed.
>>
>> Somewhat more useful example. In packets with ethernet bytes 13 and 14
>> will be 0x08 0x00 and then the IPv4 header's first byte contains the ip
>> ver. In C we have macro:
>>
>> #define IPV4_GET_RAW_VER(ip4h)            (((ip4h)->ip_verhl & 0xf0) >> 4)
>>
>> So a bitwise and followed by a rshift.
>>
>> In lua:
>>
>> function init (args)
>>     local needs = {}
>>     needs["packet"] = tostring(true)
>>     return needs
>> end
>>
>>
>> -- return match via table
>> function match(args)
>>     local result = {}
>>     local bit = require("bit")
>>     local rshift, rol = bit.rshift, bit.rol
>>
>>     for k,v in pairs(args) do
>>         if tostring(k) == "packet" then
>>             a = tostring(v)
>>
>>             if #a >= 15 and a:byte(13) == 0x08 and a:byte(14) == 0x00 then
>>                 if (rshift(bit.band(a:byte(15), 0xf0), 4) == 4) then
>>                     result["retval"] = tostring(1)
>>                 end
>>             end
>>         end
>>     end
>>
>>     return result
>> end
>>
>> return 0
>>
>>
>> --
>> ---------------------------------------------
>> Victor Julien
>> http://www.inliniac.net/
>> PGP: http://www.inliniac.net/victorjulien.asc
>> ---------------------------------------------
>>
>> _______________________________________________
>> Oisf-devel mailing list
>> Oisf-devel at openinfosecfoundation.org
>> https://lists.openinfosecfoundation.org/mailman/listinfo/oisf-devel
> 


-- 
---------------------------------------------
Victor Julien
http://www.inliniac.net/
PGP: http://www.inliniac.net/victorjulien.asc
---------------------------------------------




More information about the Oisf-devel mailing list