class 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