Class: Rex::Encoding::Xor::DwordAdditive
- Defined in:
- lib/rex/encoding/xor/dword_additive.rb
Defined Under Namespace
Classes: UnitTest
Class Method Summary collapse
-
._encode_mutate_key(buf, key, pos, len) ⇒ Object
hook in the key mutation routine of encode for the additive feedback.
-
._find_good_key(data, badkeys, badchars) ⇒ Object
I realize this algorithm is broken.
- ._packspec ⇒ Object
- .keysize ⇒ Object
- .pack_key(key) ⇒ Object
- .unpack_key(key) ⇒ Object
Methods inherited from Generic
_check, _check_encode, _check_key, _find_bad_keys, encode, find_key, find_key_and_encode
Class Method Details
._encode_mutate_key(buf, key, pos, len) ⇒ Object
hook in the key mutation routine of encode for the additive feedback
35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 35 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) ⇒ Object
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…
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 55 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 ⇒ Object
23 24 25 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 23 def DwordAdditive._packspec 'V' end |
.keysize ⇒ Object
19 20 21 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 19 def DwordAdditive.keysize 4 end |
.pack_key(key) ⇒ Object
27 28 29 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 27 def DwordAdditive.pack_key(key) return [ key ].pack(_packspec) end |
.unpack_key(key) ⇒ Object
30 31 32 |
# File 'lib/rex/encoding/xor/dword_additive.rb', line 30 def DwordAdditive.unpack_key(key) return key.unpack(_packspec)[0] end |