ronin-support 1.0.0.beta3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +14 -0
- data/.rubocop.yml +109 -0
- data/ChangeLog.md +12 -1
- data/Gemfile +8 -4
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/examples/ssl_proxy.rb +2 -1
- data/examples/tcp_proxy.rb +6 -4
- data/lib/ronin/support/archive/tar/writer.rb +2 -2
- data/lib/ronin/support/archive/tar.rb +4 -4
- data/lib/ronin/support/archive/zip/reader.rb +2 -2
- data/lib/ronin/support/binary/array.rb +4 -7
- data/lib/ronin/support/binary/bit_flip.rb +7 -1
- data/lib/ronin/support/binary/buffer.rb +22 -22
- data/lib/ronin/support/binary/byte_slice.rb +17 -17
- data/lib/ronin/support/binary/cstring.rb +7 -4
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +1 -1
- data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/native.rb +3 -0
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +1 -1
- data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes.rb +3 -3
- data/lib/ronin/support/binary/memory.rb +2 -2
- data/lib/ronin/support/binary/packet.rb +3 -0
- data/lib/ronin/support/binary/stack.rb +3 -4
- data/lib/ronin/support/binary/struct/member.rb +5 -3
- data/lib/ronin/support/binary/struct.rb +81 -79
- data/lib/ronin/support/binary/template.rb +1 -0
- data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
- data/lib/ronin/support/binary/union.rb +22 -22
- data/lib/ronin/support/cli/ansi.rb +0 -1
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
- data/lib/ronin/support/cli/io_shell.rb +4 -4
- data/lib/ronin/support/cli/printing.rb +3 -3
- data/lib/ronin/support/compression/zlib.rb +1 -1
- data/lib/ronin/support/core_ext/enumerable.rb +0 -2
- data/lib/ronin/support/core_ext/file.rb +1 -1
- data/lib/ronin/support/core_ext/kernel.rb +6 -5
- data/lib/ronin/support/core_ext/string.rb +2 -2
- data/lib/ronin/support/crypto/cert.rb +11 -15
- data/lib/ronin/support/crypto/cert_chain.rb +1 -1
- data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
- data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
- data/lib/ronin/support/crypto/cipher.rb +1 -1
- data/lib/ronin/support/crypto/core_ext/file.rb +1 -1
- data/lib/ronin/support/crypto/key/methods.rb +4 -1
- data/lib/ronin/support/crypto/key.rb +5 -2
- data/lib/ronin/support/crypto/openssl.rb +1 -1
- data/lib/ronin/support/crypto.rb +0 -1
- data/lib/ronin/support/encoding/base16.rb +1 -1
- data/lib/ronin/support/encoding/base32.rb +28 -17
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/c.rb +4 -4
- data/lib/ronin/support/encoding/hex.rb +2 -2
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/js.rb +4 -4
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/powershell.rb +4 -5
- data/lib/ronin/support/encoding/ruby.rb +4 -4
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/shell.rb +3 -3
- data/lib/ronin/support/encoding/sql.rb +1 -1
- data/lib/ronin/support/encoding/xml.rb +2 -2
- data/lib/ronin/support/encoding.rb +95 -0
- data/lib/ronin/support/network/asn/list.rb +6 -1
- data/lib/ronin/support/network/asn/record.rb +3 -0
- data/lib/ronin/support/network/asn/record_set.rb +3 -0
- data/lib/ronin/support/network/asn.rb +167 -6
- data/lib/ronin/support/network/dns/resolver.rb +3 -0
- data/lib/ronin/support/network/domain.rb +21 -21
- data/lib/ronin/support/network/email_address.rb +1 -5
- data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
- data/lib/ronin/support/network/ftp/mixin.rb +1 -1
- data/lib/ronin/support/network/host.rb +75 -47
- data/lib/ronin/support/network/http/core_ext.rb +1 -1
- data/lib/ronin/support/network/http.rb +317 -80
- data/lib/ronin/support/network/ip.rb +8 -10
- data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
- data/lib/ronin/support/network/ip_range/glob.rb +1 -0
- data/lib/ronin/support/network/ip_range/range.rb +1 -1
- data/lib/ronin/support/network/ip_range.rb +1 -3
- data/lib/ronin/support/network/proxy.rb +4 -4
- data/lib/ronin/support/network/public_suffix/list.rb +10 -8
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
- data/lib/ronin/support/network/public_suffix.rb +9 -4
- data/lib/ronin/support/network/smtp/email.rb +0 -9
- data/lib/ronin/support/network/smtp/mixin.rb +2 -2
- data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
- data/lib/ronin/support/network/ssl/mixin.rb +13 -13
- data/lib/ronin/support/network/ssl/openssl.rb +1 -1
- data/lib/ronin/support/network/ssl/proxy.rb +14 -16
- data/lib/ronin/support/network/ssl.rb +4 -2
- data/lib/ronin/support/network/tcp/proxy.rb +3 -3
- data/lib/ronin/support/network/tcp.rb +10 -12
- data/lib/ronin/support/network/telnet/mixin.rb +14 -14
- data/lib/ronin/support/network/tld/list.rb +2 -1
- data/lib/ronin/support/network/tld.rb +7 -4
- data/lib/ronin/support/network/tls/proxy.rb +1 -1
- data/lib/ronin/support/network/tls.rb +0 -2
- data/lib/ronin/support/network/udp/proxy.rb +5 -5
- data/lib/ronin/support/network/udp.rb +14 -16
- data/lib/ronin/support/path.rb +3 -3
- data/lib/ronin/support/text/erb/mixin.rb +3 -0
- data/lib/ronin/support/text/homoglyph/table.rb +3 -3
- data/lib/ronin/support/text/patterns/credentials.rb +2 -2
- data/lib/ronin/support/text/patterns/crypto.rb +1 -1
- data/lib/ronin/support/text/patterns/file_system.rb +3 -4
- data/lib/ronin/support/text/patterns/network.rb +10 -10
- data/lib/ronin/support/text/patterns/numeric.rb +1 -1
- data/lib/ronin/support/text/patterns/source_code.rb +2 -2
- data/lib/ronin/support/text/random.rb +2 -2
- data/lib/ronin/support/text/typo/generator.rb +2 -2
- data/lib/ronin/support/version.rb +1 -1
- data/ronin-support.gemspec +6 -5
- metadata +3 -2
|
@@ -27,7 +27,7 @@ module Ronin
|
|
|
27
27
|
# @since 1.0.0
|
|
28
28
|
#
|
|
29
29
|
module Printing
|
|
30
|
-
|
|
30
|
+
@debug = false
|
|
31
31
|
|
|
32
32
|
#
|
|
33
33
|
# The current debug mode.
|
|
@@ -38,7 +38,7 @@ module Ronin
|
|
|
38
38
|
# @api semipublic
|
|
39
39
|
#
|
|
40
40
|
def self.debug?
|
|
41
|
-
|
|
41
|
+
@debug
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
#
|
|
@@ -53,7 +53,7 @@ module Ronin
|
|
|
53
53
|
# @api semipublic
|
|
54
54
|
#
|
|
55
55
|
def self.debug=(debug_mode)
|
|
56
|
-
|
|
56
|
+
@debug = debug_mode
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# Enables or disables debug mode.
|
|
@@ -39,10 +39,11 @@ module Kernel
|
|
|
39
39
|
# @api public
|
|
40
40
|
#
|
|
41
41
|
def try
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
yield() if block_given?
|
|
43
|
+
rescue SyntaxError => error
|
|
44
|
+
# re-raise syntax errors
|
|
45
|
+
raise(error)
|
|
46
|
+
rescue StandardError
|
|
47
|
+
# ignore any exceptions
|
|
47
48
|
end
|
|
48
49
|
end
|
|
@@ -199,7 +199,7 @@ class String
|
|
|
199
199
|
other_index = (other.length - i - 1)
|
|
200
200
|
|
|
201
201
|
if self[index] != other[other_index]
|
|
202
|
-
return self[(index + 1)
|
|
202
|
+
return self[(index + 1)..]
|
|
203
203
|
end
|
|
204
204
|
end
|
|
205
205
|
|
|
@@ -220,7 +220,7 @@ class String
|
|
|
220
220
|
#
|
|
221
221
|
def uncommon_substring(other)
|
|
222
222
|
prefix = common_prefix(other)
|
|
223
|
-
postfix = self[prefix.length
|
|
223
|
+
postfix = self[prefix.length..].common_suffix(other[prefix.length..])
|
|
224
224
|
|
|
225
225
|
return self[prefix.length...(length - postfix.length)]
|
|
226
226
|
end
|
|
@@ -66,7 +66,7 @@ module Ronin
|
|
|
66
66
|
# The populated name.
|
|
67
67
|
#
|
|
68
68
|
def self.build(common_name: nil, organizational_unit: nil, organization: nil, locality: nil, state: nil, province: nil, country: nil)
|
|
69
|
-
name = new
|
|
69
|
+
name = new
|
|
70
70
|
name.add_entry("CN",common_name) if common_name
|
|
71
71
|
name.add_entry("OU",organizational_unit) if organizational_unit
|
|
72
72
|
name.add_entry("O",organization) if organization
|
|
@@ -83,9 +83,7 @@ module Ronin
|
|
|
83
83
|
# @return [Hash{String => String}]
|
|
84
84
|
#
|
|
85
85
|
def entries
|
|
86
|
-
@entries ||=
|
|
87
|
-
[oid, value]
|
|
88
|
-
}]
|
|
86
|
+
@entries ||= to_a.to_h { |(oid,value,type)| [oid, value] }
|
|
89
87
|
end
|
|
90
88
|
|
|
91
89
|
alias to_h entries
|
|
@@ -328,7 +326,7 @@ module Ronin
|
|
|
328
326
|
def self.generate(version: 2,
|
|
329
327
|
serial: 0,
|
|
330
328
|
not_before: Time.now,
|
|
331
|
-
not_after: not_before+ONE_YEAR,
|
|
329
|
+
not_after: not_before + ONE_YEAR,
|
|
332
330
|
subject: nil,
|
|
333
331
|
extensions: nil,
|
|
334
332
|
# signing arguments
|
|
@@ -336,9 +334,10 @@ module Ronin
|
|
|
336
334
|
ca_cert: nil,
|
|
337
335
|
ca_key: nil,
|
|
338
336
|
signing_hash: :sha256)
|
|
339
|
-
cert = new
|
|
337
|
+
cert = new
|
|
338
|
+
|
|
340
339
|
cert.version = version
|
|
341
|
-
cert.serial = if ca_cert then ca_cert.serial+1
|
|
340
|
+
cert.serial = if ca_cert then ca_cert.serial + 1
|
|
342
341
|
else serial
|
|
343
342
|
end
|
|
344
343
|
|
|
@@ -351,11 +350,10 @@ module Ronin
|
|
|
351
350
|
end
|
|
352
351
|
|
|
353
352
|
if extensions
|
|
354
|
-
extension_factory = OpenSSL::X509::ExtensionFactory.new
|
|
353
|
+
extension_factory = OpenSSL::X509::ExtensionFactory.new
|
|
354
|
+
|
|
355
355
|
extension_factory.subject_certificate = cert
|
|
356
|
-
extension_factory.issuer_certificate =
|
|
357
|
-
else cert
|
|
358
|
-
end
|
|
356
|
+
extension_factory.issuer_certificate = ca_cert || cert
|
|
359
357
|
|
|
360
358
|
extensions.each do |name,(value,critical)|
|
|
361
359
|
ext = extension_factory.create_extension(name,value,critical)
|
|
@@ -363,9 +361,7 @@ module Ronin
|
|
|
363
361
|
end
|
|
364
362
|
end
|
|
365
363
|
|
|
366
|
-
signing_key
|
|
367
|
-
else key
|
|
368
|
-
end
|
|
364
|
+
signing_key = ca_key || key
|
|
369
365
|
signing_digest = OpenSSL::Digest.const_get(signing_hash.upcase).new
|
|
370
366
|
|
|
371
367
|
cert.sign(signing_key,signing_digest)
|
|
@@ -421,7 +417,7 @@ module Ronin
|
|
|
421
417
|
# The Hash of extension OID names and extension objects.
|
|
422
418
|
#
|
|
423
419
|
def extensions_hash
|
|
424
|
-
|
|
420
|
+
extensions.to_h { |ext| [ext.oid, ext] }
|
|
425
421
|
end
|
|
426
422
|
|
|
427
423
|
#
|
|
@@ -22,6 +22,9 @@ module Ronin
|
|
|
22
22
|
module Support
|
|
23
23
|
module Crypto
|
|
24
24
|
class Cipher < OpenSSL::Cipher
|
|
25
|
+
#
|
|
26
|
+
# The AES128 cipher.
|
|
27
|
+
#
|
|
25
28
|
class AES128 < AES
|
|
26
29
|
|
|
27
30
|
#
|
|
@@ -44,7 +47,7 @@ module Ronin
|
|
|
44
47
|
# The list of supported AES 128bit cipher names.
|
|
45
48
|
#
|
|
46
49
|
def self.supported
|
|
47
|
-
super().grep(/^aes
|
|
50
|
+
super().grep(/^aes(?:-)?128/)
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
end
|
|
@@ -22,6 +22,9 @@ module Ronin
|
|
|
22
22
|
module Support
|
|
23
23
|
module Crypto
|
|
24
24
|
class Cipher < OpenSSL::Cipher
|
|
25
|
+
#
|
|
26
|
+
# The AES256 cipher.
|
|
27
|
+
#
|
|
25
28
|
class AES256 < AES
|
|
26
29
|
|
|
27
30
|
#
|
|
@@ -44,7 +47,7 @@ module Ronin
|
|
|
44
47
|
# The list of supported AES 256bit cipher names.
|
|
45
48
|
#
|
|
46
49
|
def self.supported
|
|
47
|
-
super().grep(/^aes
|
|
50
|
+
super().grep(/^aes(?:-)?256/)
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
end
|
|
@@ -172,7 +172,7 @@ class File
|
|
|
172
172
|
def self.hmac(path, key: , digest: :sha1)
|
|
173
173
|
hmac = Ronin::Support::Crypto.hmac(key: key, digest: digest)
|
|
174
174
|
|
|
175
|
-
open(path,'rb') do |file|
|
|
175
|
+
File.open(path,'rb') do |file|
|
|
176
176
|
until file.eof?
|
|
177
177
|
hmac.update(file.read(16384))
|
|
178
178
|
end
|
|
@@ -40,6 +40,9 @@ module Ronin
|
|
|
40
40
|
key_class.extend ClassMethods
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
#
|
|
44
|
+
# Class-methods.
|
|
45
|
+
#
|
|
43
46
|
module ClassMethods
|
|
44
47
|
#
|
|
45
48
|
# Generates a new random key.
|
|
@@ -151,7 +154,7 @@ module Ronin
|
|
|
151
154
|
cipher = OpenSSL::Cipher.new(cipher)
|
|
152
155
|
encoding_method.call(cipher,password)
|
|
153
156
|
else
|
|
154
|
-
encoding_method.call
|
|
157
|
+
encoding_method.call
|
|
155
158
|
end
|
|
156
159
|
|
|
157
160
|
File.write(path,exported)
|
|
@@ -24,6 +24,9 @@ require 'ronin/support/crypto/key/rsa'
|
|
|
24
24
|
module Ronin
|
|
25
25
|
module Support
|
|
26
26
|
module Crypto
|
|
27
|
+
#
|
|
28
|
+
# Top-level methods for working with public/private keys.
|
|
29
|
+
#
|
|
27
30
|
module Key
|
|
28
31
|
#
|
|
29
32
|
# Parses an PEM encoded key.
|
|
@@ -42,7 +45,7 @@ module Ronin
|
|
|
42
45
|
#
|
|
43
46
|
# @raise [ArgumentError]
|
|
44
47
|
# The key type could not be determined from the key file.
|
|
45
|
-
#
|
|
48
|
+
#
|
|
46
49
|
# @api public
|
|
47
50
|
#
|
|
48
51
|
def self.parse(key, password: nil)
|
|
@@ -93,7 +96,7 @@ module Ronin
|
|
|
93
96
|
#
|
|
94
97
|
# @raise [ArgumentError]
|
|
95
98
|
# The key type could not be determined from the key file.
|
|
96
|
-
#
|
|
99
|
+
#
|
|
97
100
|
# @api public
|
|
98
101
|
#
|
|
99
102
|
def self.load_file(path)
|
data/lib/ronin/support/crypto.rb
CHANGED
|
@@ -656,7 +656,6 @@ module Ronin
|
|
|
656
656
|
when Key::RSA then key
|
|
657
657
|
when OpenSSL::PKey::RSA then Key::RSA.new(key)
|
|
658
658
|
when String then Key::RSA.load(key, password: password)
|
|
659
|
-
else
|
|
660
659
|
end
|
|
661
660
|
else
|
|
662
661
|
raise(ArgumentError,"either key: or key_file: keyword arguments must be given")
|
|
@@ -72,14 +72,16 @@ module Ronin
|
|
|
72
72
|
return decoded
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
private
|
|
76
|
-
|
|
77
75
|
# Base32 alphabet
|
|
76
|
+
#
|
|
77
|
+
# @api private
|
|
78
78
|
TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
|
|
79
79
|
|
|
80
80
|
#
|
|
81
81
|
# Represents a chunk of data.
|
|
82
82
|
#
|
|
83
|
+
# @api private
|
|
84
|
+
#
|
|
83
85
|
class Chunk
|
|
84
86
|
|
|
85
87
|
#
|
|
@@ -103,8 +105,13 @@ module Ronin
|
|
|
103
105
|
#
|
|
104
106
|
def decode(output=String.new)
|
|
105
107
|
bytes = @bytes.take_while { |b| b != 61 } # strip padding
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
|
|
109
|
+
n = ((bytes.length * 5.0) / 8.0).floor
|
|
110
|
+
p = if bytes.length < 8
|
|
111
|
+
5 - ((n * 8) % 5)
|
|
112
|
+
else
|
|
113
|
+
0
|
|
114
|
+
end
|
|
108
115
|
c = bytes.reduce(0) { |m,o|
|
|
109
116
|
unless (i = Base32::TABLE.index(o.chr))
|
|
110
117
|
raise ArgumentError, "invalid character '#{o.chr}'"
|
|
@@ -113,8 +120,8 @@ module Ronin
|
|
|
113
120
|
(m << 5) + i
|
|
114
121
|
} >> p
|
|
115
122
|
|
|
116
|
-
(0..n-1).reverse_each
|
|
117
|
-
output << ((c >> i * 8) & 0xff).chr
|
|
123
|
+
(0..(n - 1)).reverse_each do |i|
|
|
124
|
+
output << ((c >> (i * 8)) & 0xff).chr
|
|
118
125
|
end
|
|
119
126
|
|
|
120
127
|
return output
|
|
@@ -130,15 +137,19 @@ module Ronin
|
|
|
130
137
|
# The Base32 encoded chunk.
|
|
131
138
|
#
|
|
132
139
|
def encode(output=String.new)
|
|
133
|
-
n = (@bytes.length * 8.0 / 5.0).ceil
|
|
134
|
-
p = n < 8
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
n = ((@bytes.length * 8.0) / 5.0).ceil
|
|
141
|
+
p = if n < 8
|
|
142
|
+
5 - ((@bytes.length * 8) % 5)
|
|
143
|
+
else
|
|
144
|
+
0
|
|
145
|
+
end
|
|
146
|
+
c = @bytes.inject(0) { |m,o| (m << 8) + o } << p
|
|
147
|
+
|
|
148
|
+
(0..(n - 1)).reverse_each do |i|
|
|
149
|
+
output << Base32::TABLE[(c >> (i * 5)) & 0x1f].chr
|
|
139
150
|
end
|
|
140
151
|
|
|
141
|
-
return output << ("=" * (8-n))
|
|
152
|
+
return output << ("=" * (8 - n))
|
|
142
153
|
end
|
|
143
154
|
|
|
144
155
|
end
|
|
@@ -154,11 +165,11 @@ module Ronin
|
|
|
154
165
|
#
|
|
155
166
|
# @yieldparam [Chunk] chunk
|
|
156
167
|
#
|
|
168
|
+
# @api private
|
|
169
|
+
#
|
|
157
170
|
def self.each_chunk(data,size)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
data.bytes.each_slice(size) do |bytes|
|
|
161
|
-
yield Chunk.new(bytes)
|
|
171
|
+
data.bytes.each_slice(size) do |byte_slice|
|
|
172
|
+
yield Chunk.new(byte_slice)
|
|
162
173
|
end
|
|
163
174
|
end
|
|
164
175
|
end
|
|
@@ -93,7 +93,7 @@ module Ronin
|
|
|
93
93
|
# @raise [RangeError]
|
|
94
94
|
# The integer value is negative.
|
|
95
95
|
#
|
|
96
|
-
# @example
|
|
96
|
+
# @example
|
|
97
97
|
# Encoding::C.escape_byte(0x41)
|
|
98
98
|
# # => "A"
|
|
99
99
|
# Encoding::C.escape_byte(0x22)
|
|
@@ -223,11 +223,11 @@ module Ronin
|
|
|
223
223
|
until scanner.eos?
|
|
224
224
|
unescaped << case (char = scanner.getch)
|
|
225
225
|
when "\\" # backslash
|
|
226
|
-
if (hex_char
|
|
226
|
+
if (hex_char = scanner.scan(/x[0-9a-fA-F]{1,2}/)) # \xXX
|
|
227
227
|
hex_char[1..].to_i(16).chr
|
|
228
|
-
elsif (hex_char
|
|
228
|
+
elsif (hex_char = scanner.scan(/u[0-9a-fA-F]{4,8}/)) # \u..
|
|
229
229
|
hex_char[1..].to_i(16).chr(Encoding::UTF_8)
|
|
230
|
-
elsif (octal_char
|
|
230
|
+
elsif (octal_char = scanner.scan(/[0-7]{1,3}/)) # \N, \NN, or \NNN
|
|
231
231
|
octal_char.to_i(8).chr
|
|
232
232
|
elsif (special_char = scanner.getch) # \[A-Za-z]
|
|
233
233
|
BACKSLASHED_CHARS.fetch(special_char,special_char)
|
|
@@ -198,11 +198,11 @@ module Ronin
|
|
|
198
198
|
until scanner.eos?
|
|
199
199
|
buffer << case (char = scanner.getch)
|
|
200
200
|
when '\\'
|
|
201
|
-
if (hex_escape
|
|
201
|
+
if (hex_escape = scanner.scan(/x[0-9a-fA-F]{4,8}/))
|
|
202
202
|
hex_escape[1..].to_i(16).chr(Encoding::UTF_8)
|
|
203
203
|
elsif (hex_escape = scanner.scan(/x[0-9a-fA-F]{1,2}/))
|
|
204
204
|
hex_escape[1..].to_i(16).chr
|
|
205
|
-
elsif (char
|
|
205
|
+
elsif (char = scanner.getch)
|
|
206
206
|
BACKSLASHED_CHARS.fetch(char,char)
|
|
207
207
|
end
|
|
208
208
|
else
|
|
@@ -86,7 +86,7 @@ module Ronin
|
|
|
86
86
|
# @return [String]
|
|
87
87
|
# The escaped JavaScript character.
|
|
88
88
|
#
|
|
89
|
-
# @example
|
|
89
|
+
# @example
|
|
90
90
|
# Encoding::JS.escape_byte(0x41)
|
|
91
91
|
# # => "A"
|
|
92
92
|
# Encoding::JS.escape_byte(0x22)
|
|
@@ -135,7 +135,7 @@ module Ronin
|
|
|
135
135
|
"\\f" => "\f",
|
|
136
136
|
"\\r" => "\r",
|
|
137
137
|
"\\\"" => "\"",
|
|
138
|
-
"
|
|
138
|
+
"\\'" => "'",
|
|
139
139
|
"\\\\" => "\\"
|
|
140
140
|
}
|
|
141
141
|
|
|
@@ -187,9 +187,9 @@ module Ronin
|
|
|
187
187
|
data.scan(/[\\%]u[0-9a-fA-F]{1,4}|[\\%][0-9a-fA-F]{1,2}|\\[btnfr\'\"\\]|./) do |c|
|
|
188
188
|
unescaped << BACKSLASHED_CHARS.fetch(c) do
|
|
189
189
|
if (c.start_with?("\\u") || c.start_with?("%u"))
|
|
190
|
-
c[2
|
|
190
|
+
c[2..].to_i(16)
|
|
191
191
|
elsif (c.start_with?("\\") || c.start_with?("%"))
|
|
192
|
-
c[1
|
|
192
|
+
c[1..].to_i(16)
|
|
193
193
|
else
|
|
194
194
|
c
|
|
195
195
|
end
|
|
@@ -29,7 +29,7 @@ class Integer
|
|
|
29
29
|
# @raise [RangeError]
|
|
30
30
|
# The integer value is negative.
|
|
31
31
|
#
|
|
32
|
-
# @example
|
|
32
|
+
# @example
|
|
33
33
|
# 0x41.powershell_encode
|
|
34
34
|
# # => "[char]0x41"
|
|
35
35
|
# 0x0a.powershell_encode
|
|
@@ -60,7 +60,7 @@ class Integer
|
|
|
60
60
|
# @raise [RangeError]
|
|
61
61
|
# The integer value is negative.
|
|
62
62
|
#
|
|
63
|
-
# @example
|
|
63
|
+
# @example
|
|
64
64
|
# 0x41.powershell_escape
|
|
65
65
|
# # => "A"
|
|
66
66
|
# 0x08.powershell_escape
|
|
@@ -68,7 +68,7 @@ module Ronin
|
|
|
68
68
|
# @raise [RangeError]
|
|
69
69
|
# The integer value is negative.
|
|
70
70
|
#
|
|
71
|
-
# @example
|
|
71
|
+
# @example
|
|
72
72
|
# Encoding::PowerShell.encode_byte(0x41)
|
|
73
73
|
# # => "[char]0x41"
|
|
74
74
|
# Encoding::PowerShell.encode_byte(0x0a)
|
|
@@ -100,7 +100,7 @@ module Ronin
|
|
|
100
100
|
# @raise [RangeError]
|
|
101
101
|
# The integer value is negative.
|
|
102
102
|
#
|
|
103
|
-
# @example
|
|
103
|
+
# @example
|
|
104
104
|
# Encoding::PowerShell.escape_byte(0x41)
|
|
105
105
|
# # => "A"
|
|
106
106
|
# Encoding::PowerShell.escape_byte(0x08)
|
|
@@ -197,9 +197,9 @@ module Ronin
|
|
|
197
197
|
until scanner.eos?
|
|
198
198
|
unescaped << if (backslash_char = scanner.scan(/`[0abetnvfr]/)) # `c
|
|
199
199
|
BACKSLASHED_CHARS[backslash_char[1,1]]
|
|
200
|
-
elsif (hex_char
|
|
200
|
+
elsif (hex_char = scanner.scan(/\$\(\[char\]0x[0-9a-fA-F]{1,2}\)/)) # [char]0xXX
|
|
201
201
|
hex_char[10..-2].to_i(16).chr
|
|
202
|
-
elsif (hex_char
|
|
202
|
+
elsif (hex_char = scanner.scan(/\$\(\[char\]0x[0-9a-fA-F]{3,}\)/)) # [char]0xXX
|
|
203
203
|
hex_char[10..-2].to_i(16).chr(Encoding::UTF_8)
|
|
204
204
|
elsif (unicode_char = scanner.scan(/`u\{[0-9a-fA-F]+\}/)) # `u{XXXX}'
|
|
205
205
|
unicode_char[3..-2].to_i(16).chr(Encoding::UTF_8)
|
|
@@ -299,7 +299,6 @@ module Ronin
|
|
|
299
299
|
data
|
|
300
300
|
end
|
|
301
301
|
end
|
|
302
|
-
|
|
303
302
|
end
|
|
304
303
|
end
|
|
305
304
|
end
|
|
@@ -150,6 +150,7 @@ module Ronin
|
|
|
150
150
|
else char
|
|
151
151
|
end
|
|
152
152
|
end
|
|
153
|
+
|
|
153
154
|
UNESCAPE_CHARS['\0'] = "\0"
|
|
154
155
|
UNESCAPE_CHARS['\a'] = "\a"
|
|
155
156
|
UNESCAPE_CHARS['\b'] = "\b"
|
|
@@ -180,10 +181,10 @@ module Ronin
|
|
|
180
181
|
unescaped << if (unicode_escape = scanner.scan(/\\(?:[0-7]{1,3}|[0-7])/))
|
|
181
182
|
unicode_escape[1,3].to_i(8).chr
|
|
182
183
|
elsif (hex_escape = scanner.scan(/\\u[0-9a-fA-F]{4,8}/))
|
|
183
|
-
hex_escape[2
|
|
184
|
+
hex_escape[2..].to_i(16).chr(Encoding::UTF_8)
|
|
184
185
|
elsif (hex_escape = scanner.scan(/\\x[0-9a-fA-F]{1,2}/))
|
|
185
|
-
hex_escape[2
|
|
186
|
-
elsif (escape
|
|
186
|
+
hex_escape[2..].to_i(16).chr
|
|
187
|
+
elsif (escape = scanner.scan(/\\./))
|
|
187
188
|
UNESCAPE_CHARS[escape]
|
|
188
189
|
else
|
|
189
190
|
scanner.getch
|
|
@@ -235,7 +236,6 @@ module Ronin
|
|
|
235
236
|
data
|
|
236
237
|
end
|
|
237
238
|
end
|
|
238
|
-
|
|
239
239
|
end
|
|
240
240
|
end
|
|
241
241
|
end
|
|
@@ -29,7 +29,7 @@ class Integer
|
|
|
29
29
|
# @raise [RangeError]
|
|
30
30
|
# The integer value is negative.
|
|
31
31
|
#
|
|
32
|
-
# @example
|
|
32
|
+
# @example
|
|
33
33
|
# 0x41.shell_encode
|
|
34
34
|
# # => "\\x41"
|
|
35
35
|
# 0x0a.shell_encode
|
|
@@ -61,7 +61,7 @@ class Integer
|
|
|
61
61
|
# @raise [RangeError]
|
|
62
62
|
# The integer value is negative.
|
|
63
63
|
#
|
|
64
|
-
# @example
|
|
64
|
+
# @example
|
|
65
65
|
# 0x41.shell_escape
|
|
66
66
|
# # => "A"
|
|
67
67
|
# 0x08.shell_escape
|
|
@@ -66,7 +66,7 @@ module Ronin
|
|
|
66
66
|
# @raise [RangeError]
|
|
67
67
|
# The byte value is negative.
|
|
68
68
|
#
|
|
69
|
-
# @example
|
|
69
|
+
# @example
|
|
70
70
|
# Encoding::Shell.encode_byte(0x41)
|
|
71
71
|
# # => "\\x41"
|
|
72
72
|
# Encoding::Shell.encode_byte(0x0a)
|
|
@@ -98,7 +98,7 @@ module Ronin
|
|
|
98
98
|
# @raise [RangeError]
|
|
99
99
|
# The integer value is negative.
|
|
100
100
|
#
|
|
101
|
-
# @example
|
|
101
|
+
# @example
|
|
102
102
|
# Encoding::Shell.escape(0x41)
|
|
103
103
|
# # => "A"
|
|
104
104
|
# Encoding::Shell.escape(0x08)
|
|
@@ -188,7 +188,7 @@ module Ronin
|
|
|
188
188
|
until scanner.eos?
|
|
189
189
|
unescaped << if (backslash_char = scanner.scan(/\\[0abetnvfr\'\"]/)) # \n
|
|
190
190
|
BACKSLASHED_CHARS[backslash_char[1..]]
|
|
191
|
-
elsif (hex_char
|
|
191
|
+
elsif (hex_char = scanner.scan(/\\x[0-9a-fA-F]+/)) # \XX
|
|
192
192
|
hex_char[2..].to_i(16).chr
|
|
193
193
|
elsif (unicode_char = scanner.scan(/\\u[0-9a-fA-F]+/)) # \uXXXX
|
|
194
194
|
unicode_char[2..].to_i(16).chr(Encoding::UTF_8)
|