Parent

Class/Module Index [+]

Quicksearch

Rex::Encoding::Xor::DwordAdditive

Public Class Methods

_encode_mutate_key(buf, key, pos, len) click to toggle source

hook in the key mutation routine of encode for the additive feedback

# File lib/rex/encoding/xor/dword_additive.rb, line 33
def DwordAdditive._encode_mutate_key(buf, key, pos, len)
        if (pos + 1) % len == 0
                # add the last len bytes (in this case 4) with the key,
                # dropping off any overflow
                key = pack_key(
                  unpack_key(key) + unpack_key(buf[pos - (len - 1), len]) &
                    (1 << (len << 3)) - 1
                )
        end

        return key
end
_find_good_key(data, badkeys, badchars) click to toggle source

I realize this algorithm is broken. We invalidate some keys in _find_bad_keys that could actually be perfectly fine. However, it seems to work ok for now, and this is all just a lame adhoc method. Maybe someday we can revisit this and make it a bit less ghetto...

# File lib/rex/encoding/xor/dword_additive.rb, line 53
def DwordAdditive._find_good_key(data, badkeys, badchars)

        ksize  = keysize
        kstart = ""
        ksize.times { kstart << rand(256) } # random key starting place

        key = kstart.dup

        #
        # now for the ghettoness of an algorithm:
        #  try the random key we picked
        #  if the key failed, figure out which key byte corresponds
        #  increment that key byte
        #  if we wrapped a byte all the way around, fail :(
        #

        loop do
                # ok, try to encode it, any bad chars present?
                pos = _check(data, key, badchars)

                # yay, no problems, we found a key!
                break if !pos

                strip = pos % ksize

                # increment the offending key byte
                key[strip] = key[strip] + 1 & 0xff

                # We wrapped around!
                if key[strip] == kstart[strip]
                        raise KeySearchError, "Key space exhausted on strip #{strip}!", caller
                end
        end

        return key
end
_packspec() click to toggle source
# File lib/rex/encoding/xor/dword_additive.rb, line 21
def DwordAdditive._packspec
        'V'
end
keysize() click to toggle source
# File lib/rex/encoding/xor/dword_additive.rb, line 17
def DwordAdditive.keysize
        4
end
pack_key(key) click to toggle source
# File lib/rex/encoding/xor/dword_additive.rb, line 25
def DwordAdditive.pack_key(key)
        return [ key ].pack(_packspec)
end
unpack_key(key) click to toggle source
# File lib/rex/encoding/xor/dword_additive.rb, line 28
def DwordAdditive.unpack_key(key)
        return key.unpack(_packspec)[0]
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.