ronin-support 0.4.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +28 -0
  4. data/.ruby-version +1 -0
  5. data/.yardopts +1 -1
  6. data/ChangeLog.md +121 -33
  7. data/Gemfile +17 -18
  8. data/README.md +57 -33
  9. data/Rakefile +10 -3
  10. data/gemspec.yml +16 -7
  11. data/lib/ronin/binary.rb +21 -0
  12. data/lib/ronin/binary/hexdump.rb +20 -0
  13. data/lib/ronin/binary/hexdump/parser.rb +403 -0
  14. data/lib/ronin/binary/struct.rb +567 -0
  15. data/lib/ronin/binary/template.rb +454 -0
  16. data/lib/ronin/extensions.rb +5 -5
  17. data/lib/ronin/extensions/enumerable.rb +5 -5
  18. data/lib/ronin/extensions/file.rb +39 -33
  19. data/lib/ronin/extensions/ip_addr.rb +29 -31
  20. data/lib/ronin/extensions/kernel.rb +5 -5
  21. data/lib/ronin/extensions/meta.rb +5 -5
  22. data/lib/ronin/extensions/regexp.rb +50 -5
  23. data/lib/ronin/extensions/resolv.rb +7 -9
  24. data/lib/ronin/extensions/string.rb +10 -10
  25. data/lib/ronin/formatting.rb +5 -5
  26. data/lib/ronin/formatting/binary.rb +5 -5
  27. data/lib/ronin/formatting/digest.rb +5 -5
  28. data/lib/ronin/formatting/extensions.rb +5 -5
  29. data/lib/ronin/formatting/extensions/binary.rb +7 -5
  30. data/lib/ronin/formatting/extensions/binary/array.rb +61 -0
  31. data/lib/ronin/formatting/extensions/binary/base64.rb +106 -0
  32. data/lib/ronin/formatting/extensions/binary/file.rb +44 -11
  33. data/lib/ronin/formatting/extensions/binary/float.rb +65 -0
  34. data/lib/ronin/formatting/extensions/binary/integer.rb +66 -50
  35. data/lib/ronin/formatting/extensions/binary/string.rb +81 -205
  36. data/lib/ronin/formatting/extensions/digest.rb +5 -5
  37. data/lib/ronin/formatting/extensions/digest/file.rb +5 -5
  38. data/lib/ronin/formatting/extensions/digest/string.rb +5 -5
  39. data/lib/ronin/formatting/extensions/html.rb +5 -5
  40. data/lib/ronin/formatting/extensions/html/integer.rb +9 -13
  41. data/lib/ronin/formatting/extensions/html/string.rb +31 -39
  42. data/lib/ronin/formatting/extensions/http.rb +5 -5
  43. data/lib/ronin/formatting/extensions/http/integer.rb +6 -6
  44. data/lib/ronin/formatting/extensions/http/string.rb +7 -7
  45. data/lib/ronin/formatting/extensions/sql.rb +5 -5
  46. data/lib/ronin/formatting/extensions/sql/string.rb +22 -24
  47. data/lib/ronin/formatting/extensions/text.rb +5 -5
  48. data/lib/ronin/formatting/extensions/text/array.rb +13 -11
  49. data/lib/ronin/formatting/extensions/text/string.rb +70 -13
  50. data/lib/ronin/formatting/html.rb +5 -5
  51. data/lib/ronin/formatting/http.rb +5 -5
  52. data/lib/ronin/formatting/sql.rb +5 -5
  53. data/lib/ronin/formatting/text.rb +5 -5
  54. data/lib/ronin/fuzzing.rb +5 -5
  55. data/lib/ronin/fuzzing/extensions.rb +5 -5
  56. data/lib/ronin/fuzzing/extensions/string.rb +42 -213
  57. data/lib/ronin/fuzzing/fuzzer.rb +110 -0
  58. data/lib/ronin/fuzzing/fuzzing.rb +33 -26
  59. data/lib/ronin/fuzzing/mutator.rb +161 -0
  60. data/lib/ronin/fuzzing/repeater.rb +81 -0
  61. data/lib/ronin/fuzzing/template.rb +133 -0
  62. data/lib/ronin/mixin.rb +2 -2
  63. data/lib/ronin/network.rb +7 -5
  64. data/lib/ronin/network/dns.rb +64 -24
  65. data/lib/ronin/network/esmtp.rb +5 -5
  66. data/lib/ronin/network/extensions.rb +5 -5
  67. data/lib/ronin/network/extensions/dns.rb +5 -5
  68. data/lib/ronin/network/extensions/dns/net.rb +5 -5
  69. data/lib/ronin/network/extensions/esmtp.rb +5 -5
  70. data/lib/ronin/network/extensions/esmtp/net.rb +5 -5
  71. data/lib/ronin/network/extensions/http.rb +5 -5
  72. data/lib/ronin/network/extensions/http/net.rb +5 -5
  73. data/lib/ronin/network/extensions/http/uri/http.rb +5 -5
  74. data/lib/ronin/network/extensions/imap.rb +5 -5
  75. data/lib/ronin/network/extensions/imap/net.rb +5 -5
  76. data/lib/ronin/network/extensions/pop3.rb +5 -5
  77. data/lib/ronin/network/extensions/pop3/net.rb +5 -5
  78. data/lib/ronin/network/extensions/smtp.rb +5 -5
  79. data/lib/ronin/network/extensions/smtp/net.rb +5 -5
  80. data/lib/ronin/network/extensions/ssl.rb +5 -5
  81. data/lib/ronin/network/extensions/ssl/net.rb +5 -5
  82. data/lib/ronin/network/extensions/tcp.rb +5 -5
  83. data/lib/ronin/network/extensions/tcp/net.rb +5 -5
  84. data/lib/ronin/network/extensions/telnet.rb +5 -5
  85. data/lib/ronin/network/extensions/telnet/net.rb +5 -5
  86. data/lib/ronin/network/extensions/udp.rb +5 -5
  87. data/lib/ronin/network/extensions/udp/net.rb +5 -5
  88. data/lib/ronin/network/ftp.rb +149 -0
  89. data/lib/ronin/network/http.rb +5 -5
  90. data/lib/ronin/network/http/exceptions.rb +5 -5
  91. data/lib/ronin/network/http/exceptions/unknown_request.rb +5 -5
  92. data/lib/ronin/network/http/http.rb +65 -70
  93. data/lib/ronin/network/http/proxy.rb +5 -5
  94. data/lib/ronin/network/imap.rb +16 -15
  95. data/lib/ronin/network/mixins.rb +6 -5
  96. data/lib/ronin/network/mixins/dns.rb +5 -5
  97. data/lib/ronin/network/mixins/esmtp.rb +5 -5
  98. data/lib/ronin/network/mixins/ftp.rb +155 -0
  99. data/lib/ronin/network/mixins/http.rb +58 -587
  100. data/lib/ronin/network/mixins/imap.rb +5 -5
  101. data/lib/ronin/network/mixins/mixin.rb +5 -5
  102. data/lib/ronin/network/mixins/pop3.rb +5 -5
  103. data/lib/ronin/network/mixins/smtp.rb +5 -5
  104. data/lib/ronin/network/mixins/ssl.rb +5 -5
  105. data/lib/ronin/network/mixins/tcp.rb +43 -10
  106. data/lib/ronin/network/mixins/telnet.rb +5 -5
  107. data/lib/ronin/network/mixins/udp.rb +126 -6
  108. data/lib/ronin/network/mixins/unix.rb +279 -0
  109. data/lib/ronin/network/network.rb +5 -5
  110. data/lib/ronin/network/pop3.rb +10 -10
  111. data/lib/ronin/network/proxy.rb +578 -0
  112. data/lib/ronin/network/smtp.rb +5 -5
  113. data/lib/ronin/network/smtp/email.rb +6 -6
  114. data/lib/ronin/network/smtp/smtp.rb +12 -13
  115. data/lib/ronin/network/ssl.rb +16 -17
  116. data/lib/ronin/network/tcp.rb +7 -310
  117. data/lib/ronin/network/tcp/proxy.rb +417 -0
  118. data/lib/ronin/network/tcp/tcp.rb +452 -0
  119. data/lib/ronin/network/telnet.rb +34 -28
  120. data/lib/ronin/network/udp.rb +7 -271
  121. data/lib/ronin/network/udp/proxy.rb +191 -0
  122. data/lib/ronin/network/udp/udp.rb +452 -0
  123. data/lib/ronin/network/unix.rb +286 -0
  124. data/lib/ronin/path.rb +35 -39
  125. data/lib/ronin/spec/ui/output.rb +6 -12
  126. data/lib/ronin/support.rb +6 -5
  127. data/lib/ronin/support/inflector.rb +8 -12
  128. data/lib/ronin/support/support.rb +7 -5
  129. data/lib/ronin/support/version.rb +6 -6
  130. data/lib/ronin/templates.rb +5 -5
  131. data/lib/ronin/templates/erb.rb +5 -5
  132. data/lib/ronin/templates/template.rb +5 -5
  133. data/lib/ronin/ui/output.rb +5 -5
  134. data/lib/ronin/ui/output/helpers.rb +42 -28
  135. data/lib/ronin/ui/output/output.rb +17 -21
  136. data/lib/ronin/ui/output/terminal.rb +5 -5
  137. data/lib/ronin/ui/output/terminal/color.rb +15 -9
  138. data/lib/ronin/ui/output/terminal/raw.rb +5 -5
  139. data/lib/ronin/ui/shell.rb +8 -11
  140. data/lib/ronin/wordlist.rb +110 -30
  141. data/ronin-support.gemspec +39 -109
  142. data/spec/binary/hexdump/helpers/hexdumps.rb +13 -0
  143. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/ascii.bin +0 -0
  144. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -0
  145. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_bytes.txt +0 -0
  146. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_shorts.txt +0 -0
  147. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_bytes.txt +0 -0
  148. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_shorts.txt +0 -0
  149. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_repeated.txt +0 -0
  150. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_bytes.txt +0 -0
  151. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_ints.txt +0 -0
  152. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_quads.txt +0 -0
  153. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_shorts.txt +0 -0
  154. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +17 -0
  155. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +17 -0
  156. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_bytes.txt +0 -0
  157. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_ints.txt +0 -0
  158. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_quads.txt +0 -0
  159. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_shorts.txt +0 -0
  160. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +17 -0
  161. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_bytes.txt +0 -0
  162. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_ints.txt +0 -0
  163. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_quads.txt +0 -0
  164. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_shorts.txt +0 -0
  165. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_repeated.txt +0 -0
  166. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/repeated.bin +0 -0
  167. data/spec/binary/hexdump/parser_spec.rb +302 -0
  168. data/spec/binary/struct_spec.rb +496 -0
  169. data/spec/binary/template_spec.rb +416 -0
  170. data/spec/extensions/enumerable_spec.rb +4 -4
  171. data/spec/extensions/file_spec.rb +12 -14
  172. data/spec/extensions/ip_addr_spec.rb +76 -50
  173. data/spec/extensions/kernel_spec.rb +7 -7
  174. data/spec/extensions/regexp_spec.rb +119 -59
  175. data/spec/extensions/resolv_spec.rb +2 -2
  176. data/spec/extensions/string_spec.rb +31 -30
  177. data/spec/formatting/binary/array_spec.rb +26 -0
  178. data/spec/formatting/binary/base64_spec.rb +50 -0
  179. data/spec/formatting/binary/float_spec.rb +36 -0
  180. data/spec/formatting/binary/integer_spec.rb +76 -50
  181. data/spec/formatting/binary/string_spec.rb +91 -198
  182. data/spec/formatting/digest/string_spec.rb +5 -5
  183. data/spec/formatting/html/integer_spec.rb +6 -6
  184. data/spec/formatting/html/string_spec.rb +10 -10
  185. data/spec/formatting/http/integer_spec.rb +3 -3
  186. data/spec/formatting/http/string_spec.rb +5 -5
  187. data/spec/formatting/sql/string_spec.rb +21 -19
  188. data/spec/formatting/text/array_spec.rb +15 -15
  189. data/spec/formatting/text/string_spec.rb +58 -28
  190. data/spec/fuzzing/extensions/string_spec.rb +87 -0
  191. data/spec/fuzzing/fuzzer_spec.rb +109 -0
  192. data/spec/fuzzing/fuzzing_spec.rb +24 -0
  193. data/spec/fuzzing/mutator_spec.rb +112 -0
  194. data/spec/fuzzing/repeater_spec.rb +57 -0
  195. data/spec/fuzzing/template_spec.rb +54 -0
  196. data/spec/mixin_spec.rb +10 -12
  197. data/spec/network/dns_spec.rb +89 -23
  198. data/spec/network/ftp_spec.rb +81 -0
  199. data/spec/network/http/http_spec.rb +237 -144
  200. data/spec/network/http/proxy_spec.rb +37 -37
  201. data/spec/network/network_spec.rb +2 -2
  202. data/spec/network/proxy_spec.rb +121 -0
  203. data/spec/network/shared/unix_server.rb +31 -0
  204. data/spec/network/smtp/email_spec.rb +14 -14
  205. data/spec/network/ssl_spec.rb +53 -3
  206. data/spec/network/tcp/proxy_spec.rb +118 -0
  207. data/spec/network/tcp/tcp_spec.rb +316 -0
  208. data/spec/network/telnet_spec.rb +67 -0
  209. data/spec/network/udp/udp_spec.rb +298 -0
  210. data/spec/network/unix_spec.rb +182 -0
  211. data/spec/path_spec.rb +43 -18
  212. data/spec/spec_helper.rb +2 -3
  213. data/spec/support/inflector_spec.rb +4 -4
  214. data/spec/support_spec.rb +1 -1
  215. data/spec/templates/erb_spec.rb +3 -3
  216. data/spec/templates/template_spec.rb +10 -10
  217. data/spec/ui/shell_spec.rb +15 -15
  218. data/spec/wordlist_spec.rb +80 -19
  219. metadata +176 -121
  220. data/.gemtest +0 -0
  221. data/spec/formatting/binary/helpers/hexdumps.rb +0 -16
  222. data/spec/fuzzing/string_spec.rb +0 -158
  223. data/spec/network/tcp_spec.rb +0 -247
  224. data/spec/network/udp_spec.rb +0 -248
@@ -0,0 +1,65 @@
1
+ #
2
+ # Copyright (c) 2006-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ #
4
+ # This file is part of ronin-support.
5
+ #
6
+ # ronin-support is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # ronin-support is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License
17
+ # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'ronin/binary/template'
21
+
22
+ class Float
23
+
24
+ #
25
+ # Packs the Float into a String.
26
+ #
27
+ # @param [String, Symbol] argument
28
+ # The `Array#pack` String code or {Ronin::Binary::Template} type.
29
+ #
30
+ # @return [String]
31
+ # The packed float.
32
+ #
33
+ # @raise [ArgumentError]
34
+ # The given Symbol could not be found in
35
+ # {Ronin::Binary::Template::FLOAT_TYPES}.
36
+ #
37
+ # @example using `Array#pack` template:
38
+ # 0.42.pack('F')
39
+ # # => =\n\xD7>"
40
+ #
41
+ # @example using {Ronin::Binary::Template} types:
42
+ # 0x42.pack(:float_be)
43
+ # # => ">\xD7\n="
44
+ #
45
+ # @see https://rubydoc.info/stdlib/core/Array:pack
46
+ # @see Ronin::Binary::Template
47
+ #
48
+ # @since 0.5.0
49
+ #
50
+ # @api public
51
+ #
52
+ def pack(argument)
53
+ case argument
54
+ when String
55
+ [self].pack(argument)
56
+ else
57
+ unless Ronin::Binary::Template::FLOAT_TYPES.include?(argument)
58
+ raise(ArgumentError,"unsupported integer type: #{argument}")
59
+ end
60
+
61
+ [self].pack(Ronin::Binary::Template::TYPES[argument])
62
+ end
63
+ end
64
+
65
+ end
@@ -1,37 +1,39 @@
1
1
  #
2
- # Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2006-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
- # This file is part of Ronin Support.
4
+ # This file is part of ronin-support.
5
5
  #
6
- # Ronin Support is free software: you can redistribute it and/or modify
6
+ # ronin-support is free software: you can redistribute it and/or modify
7
7
  # it under the terms of the GNU Lesser General Public License as published
8
8
  # by the Free Software Foundation, either version 3 of the License, or
9
9
  # (at your option) any later version.
10
10
  #
11
- # Ronin Support is distributed in the hope that it will be useful,
11
+ # ronin-support is distributed in the hope that it will be useful,
12
12
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
13
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
14
  # GNU Lesser General Public License for more details.
15
15
  #
16
16
  # You should have received a copy of the GNU Lesser General Public License
17
- # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
+ require 'ronin/binary/template'
21
+
20
22
  class Integer
21
23
 
22
24
  #
23
25
  # Extracts a sequence of bytes which represent the Integer.
24
26
  #
25
- # @param [Integer] address_length
27
+ # @param [Integer] length
26
28
  # The number of bytes to decode from the Integer.
27
29
  #
28
30
  # @param [Symbol, String] endian
29
31
  # The endianness to use while decoding the bytes of the Integer.
30
32
  # May be one of:
31
33
  #
32
- # * `:big` / `"big"`
33
- # * `:little` / `"little"`
34
- # * `:net` / `"net"`
34
+ # * `big`
35
+ # * `little`
36
+ # * `net`
35
37
  #
36
38
  # @return [Array]
37
39
  # The bytes decoded from the Integer.
@@ -39,9 +41,9 @@ class Integer
39
41
  # @raise [ArgumentError]
40
42
  # The given `endian` was not one of:
41
43
  #
42
- # * `:little` / `"little"`
43
- # * `:net` / `"net"`
44
- # * `:big` / `"big"`
44
+ # * `little`
45
+ # * `net`
46
+ # * `big`
45
47
  #
46
48
  # @example
47
49
  # 0xff41.bytes(2)
@@ -53,26 +55,26 @@ class Integer
53
55
  #
54
56
  # @api public
55
57
  #
56
- def bytes(address_length,endian=:little)
58
+ def bytes(length,endian=:little)
57
59
  endian = endian.to_sym
58
60
  buffer = []
59
61
 
60
62
  case endian
61
- when :little, :net
63
+ when :little
62
64
  mask = 0xff
63
65
  shift = 0
64
66
 
65
- address_length.times do |i|
67
+ length.times do |i|
66
68
  buffer << ((self & mask) >> shift)
67
69
 
68
70
  mask <<= 8
69
71
  shift += 8
70
72
  end
71
- when :big
72
- shift = ((address_length - 1) * 8)
73
+ when :big, :net
74
+ shift = ((length - 1) * 8)
73
75
  mask = (0xff << shift)
74
76
 
75
- address_length.times do |i|
77
+ length.times do |i|
76
78
  buffer << ((self & mask) >> shift)
77
79
 
78
80
  mask >>= 8
@@ -86,63 +88,77 @@ class Integer
86
88
  end
87
89
 
88
90
  #
89
- # Packs the Integer into a String, for a specific architecture and
90
- # address-length.
91
- #
92
- # @param [Ronin::Arch, #endian, #address_length, String] arch
93
- # The architecture to pack the Integer for.
91
+ # Packs the Integer into a String.
94
92
  #
95
- # @param [Integer] address_length
96
- # The number of bytes to pack.
93
+ # @param [String, Symbol, arch] arguments
94
+ # The `Array#pack` code, {Ronin::Binary::Template} type or Architecture
95
+ # object with `#endian` and `#address_length` methods.
97
96
  #
98
97
  # @return [String]
99
98
  # The packed Integer.
100
99
  #
101
100
  # @raise [ArgumentError]
102
- # The given `arch` does not respond to the `endian` or
103
- # `address_length` methods.
101
+ # The given Symbol could not be found in
102
+ # {Ronin::Binary::Template::INT_TYPES}.
103
+ #
104
+ # @example using a `Array#pack` template:
105
+ # 0x41.pack('V')
106
+ # # => "A\0\0\0"
107
+ #
108
+ # @example using {Ronin::Binary::Template} types:
109
+ # 0x41.pack(:uint32_le)
104
110
  #
105
- # @example using archs other than `Ronin::Arch`.
111
+ # @example using archs other than `Ronin::Arch` (**deprecated**):
106
112
  # arch = OpenStruct.new(:endian => :little, :address_length => 4)
107
- #
113
+ #
108
114
  # 0x41.pack(arch)
109
115
  # # => "A\0\0\0"
110
116
  #
111
- # @example using a `Ronin::Arch` arch.
117
+ # @example using a `Ronin::Arch` arch (**deprecated**):
112
118
  # 0x41.pack(Arch.i686)
113
119
  # # => "A\0\0\0"
114
120
  #
115
- # @example specifying a custom address-length.
121
+ # @example specifying a custom address-length (**deprecated**):
116
122
  # 0x41.pack(Arch.ppc,2)
117
123
  # # => "\0A"
118
124
  #
119
- # @example using a `Array#pack` template String for the arch.
120
- # 0x41.pack('L')
121
- # # => "A\0\0\0"
122
- #
123
- # @see http://ruby-doc.org/core/classes/Array.html#M002222
125
+ # @see https://rubydoc.info/stdlib/core/Array:pack
126
+ # @see Ronin::Binary::Template
124
127
  #
125
128
  # @api public
126
129
  #
127
- def pack(arch,address_length=nil)
128
- if arch.kind_of?(String)
129
- return [self].pack(arch)
130
- end
130
+ def pack(*arguments)
131
+ if (arguments.length == 1 && arguments.first.kind_of?(String))
132
+ [self].pack(arguments.first)
133
+ elsif (arguments.length == 1 && arguments.first.kind_of?(Symbol))
134
+ type = arguments.first
131
135
 
132
- unless arch.respond_to?(:address_length)
133
- raise(ArgumentError,"first argument to Ineger#pack must respond to address_length")
134
- end
136
+ unless Ronin::Binary::Template::INT_TYPES.include?(type)
137
+ raise(ArgumentError,"unsupported integer type: #{type}")
138
+ end
135
139
 
136
- unless arch.respond_to?(:endian)
137
- raise(ArgumentError,"first argument to Ineger#pack must respond to endian")
138
- end
140
+ [self].pack(Ronin::Binary::Template::TYPES[type])
141
+ elsif (arguments.length == 1 || arguments.length == 2)
142
+ # TODO: deprecate this calling convention
143
+ arch, address_length = arguments
139
144
 
140
- address_length ||= arch.address_length
145
+ unless arch.respond_to?(:address_length)
146
+ raise(ArgumentError,"first argument to Ineger#pack must respond to address_length")
147
+ end
141
148
 
142
- integer_bytes = bytes(address_length,arch.endian)
143
- integer_bytes.map! { |b| b.chr }
149
+ unless arch.respond_to?(:endian)
150
+ raise(ArgumentError,"first argument to Ineger#pack must respond to endian")
151
+ end
144
152
 
145
- return integer_bytes.join
153
+ address_length ||= arch.address_length
154
+
155
+ integer_bytes = bytes(address_length,arch.endian)
156
+ integer_bytes.map! { |b| b.chr }
157
+
158
+ return integer_bytes.join
159
+ else
160
+ raise(ArgumentError,"wrong number of arguments (#{arguments.length} for 1..2)")
161
+ end
146
162
  end
147
163
 
148
164
  #
@@ -1,27 +1,27 @@
1
1
  #
2
- # Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2006-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
- # This file is part of Ronin Support.
4
+ # This file is part of ronin-support.
5
5
  #
6
- # Ronin Support is free software: you can redistribute it and/or modify
6
+ # ronin-support is free software: you can redistribute it and/or modify
7
7
  # it under the terms of the GNU Lesser General Public License as published
8
8
  # by the Free Software Foundation, either version 3 of the License, or
9
9
  # (at your option) any later version.
10
10
  #
11
- # Ronin Support is distributed in the hope that it will be useful,
11
+ # ronin-support is distributed in the hope that it will be useful,
12
12
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
13
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
14
  # GNU Lesser General Public License for more details.
15
15
  #
16
16
  # You should have received a copy of the GNU Lesser General Public License
17
- # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
+ require 'ronin/formatting/extensions/binary/base64'
20
21
  require 'ronin/formatting/extensions/binary/integer'
21
- require 'ronin/formatting/extensions/text'
22
-
23
- require 'base64'
24
- require 'enumerator'
22
+ require 'ronin/formatting/extensions/text/string'
23
+ require 'ronin/binary/hexdump/parser'
24
+ require 'ronin/binary/template'
25
25
 
26
26
  begin
27
27
  require 'zlib'
@@ -31,9 +31,45 @@ end
31
31
 
32
32
  class String
33
33
 
34
+ alias unpack_original unpack
35
+
36
+ #
37
+ # Unpacks the String.
38
+ #
39
+ # @param [String, Array<Symbol, (Symbol, Integer)>] arguments
40
+ # The `String#unpack` template or a list of {Ronin::Binary::Template} types.
41
+ #
42
+ # @return [Array]
43
+ # The values unpacked from the String.
44
+ #
45
+ # @raise [ArgumentError]
46
+ # One of the arguments was not a known {Ronin::Binary::Template} type.
47
+ #
48
+ # @example using {Ronin::Binary::Template} types:
49
+ # "A\0\0\0hello\0".unpack(:uint32_le, :string)
50
+ # # => [10, "hello"]
51
+ #
52
+ # @example using a `String#unpack` template:
53
+ # "A\0\0\0".unpack('V')
54
+ # # => 65
55
+ #
56
+ # @see https://rubydoc.info/stdlib/core/String:unpack
57
+ # @see Ronin::Binary::Template
58
+ #
59
+ # @since 0.5.0
60
+ #
61
+ # @api public
62
+ #
63
+ def unpack(*arguments)
64
+ if (arguments.length == 1 && arguments.first.kind_of?(String))
65
+ unpack_original(arguments.first)
66
+ else
67
+ unpack_original(Ronin::Binary::Template.compile(arguments))
68
+ end
69
+ end
70
+
34
71
  #
35
- # Packs an Integer from a String, which was originally packed for
36
- # a specific architecture and address-length.
72
+ # Unpacks the String into an Integer.
37
73
  #
38
74
  # @param [Ronin::Arch, #endian, #address_length, String] arch
39
75
  # The architecture that the Integer was originally packed with.
@@ -45,34 +81,35 @@ class String
45
81
  # The depacked Integer.
46
82
  #
47
83
  # @raise [ArgumentError]
48
- # The given `arch` does not respond to the `endian` or
49
- # `address_length` methods.
84
+ # The given `arch` does not respond to the `endian` or `address_length`
85
+ # methods.
50
86
  #
51
- # @example using archs other than `Ronin::Arch`.
87
+ # @example using archs other than `Ronin::Arch`:
52
88
  # arch = OpenStruct.new(:endian => :little, :address_length => 4)
53
89
  #
54
90
  # "A\0\0\0".depack(arch)
55
91
  # # => 65
56
92
  #
57
- # @example using a `Ronin::Arch` arch.
93
+ # @example using a `Ronin::Arch` arch:
58
94
  # "A\0\0\0".depack(Arch.i386)
59
95
  # # => 65
60
96
  #
61
- # @example specifying a custom address-length.
97
+ # @example specifying a custom address-length:
62
98
  # "A\0".depack(Arch.ppc,2)
63
99
  # # => 65
64
100
  #
65
- # @example using a `String#unpack` template String as the arch.
66
- # "A\0\0\0".depack('L')
101
+ # @example using a `String#unpack` template:
102
+ # "A\0\0\0".depack('V')
67
103
  # # => 65
68
104
  #
69
- # @see http://ruby-doc.org/core/classes/String.html#M000760
105
+ # @deprecated
106
+ # Deprecated as of 0.5.0, use {#unpack} instead.
70
107
  #
71
108
  # @api public
72
- #
109
+ #
73
110
  def depack(arch,address_length=nil)
74
111
  if arch.kind_of?(String)
75
- return self.unpack(arch)
112
+ return unpack(arch)
76
113
  end
77
114
 
78
115
  unless arch.respond_to?(:address_length)
@@ -86,7 +123,7 @@ class String
86
123
  endian = arch.endian.to_sym
87
124
  address_length ||= arch.address_length
88
125
 
89
- integer = 0x0
126
+ integer = 0x0
90
127
  byte_index = 0
91
128
 
92
129
  case endian
@@ -128,66 +165,7 @@ class String
128
165
  format_bytes(options) { |b| b.hex_escape }
129
166
  end
130
167
 
131
- #
132
- # Unescapes the hex-escaped String.
133
- #
134
- # @return [String]
135
- # The unescaped version of the hex escaped String.
136
- #
137
- # @example
138
- # "\\x68\\x65\\x6c\\x6c\\x6f".hex_unescape
139
- # # => "hello"
140
- #
141
- # @api public
142
- #
143
- def hex_unescape
144
- buffer = ''
145
- hex_index = 0
146
- hex_length = length
147
-
148
- while (hex_index < hex_length)
149
- hex_substring = self[hex_index..-1]
150
-
151
- if hex_substring =~ /^\\[0-7]{3}/
152
- buffer << hex_substring[0..3].to_i(8)
153
- hex_index += 3
154
- elsif hex_substring =~ /^\\x[0-9a-fA-F]{1,2}/
155
- hex_substring[2..-1].scan(/^[0-9a-fA-F]{1,2}/) do |hex_byte|
156
- buffer << hex_byte.to_i(16)
157
- hex_index += (2 + hex_byte.length)
158
- end
159
- elsif hex_substring =~ /^\\./
160
- escaped_char = hex_substring[1..1]
161
-
162
- buffer << case escaped_char
163
- when '0'
164
- "\0"
165
- when 'a'
166
- "\a"
167
- when 'b'
168
- "\b"
169
- when 't'
170
- "\t"
171
- when 'n'
172
- "\n"
173
- when 'v'
174
- "\v"
175
- when 'f'
176
- "\f"
177
- when 'r'
178
- "\r"
179
- else
180
- escaped_char
181
- end
182
- hex_index += 2
183
- else
184
- buffer << hex_substring[0]
185
- hex_index += 1
186
- end
187
- end
188
-
189
- return buffer
190
- end
168
+ alias hex_unescape unescape
191
169
 
192
170
  #
193
171
  # XOR encodes the String.
@@ -210,12 +188,9 @@ class String
210
188
  #
211
189
  def xor(key)
212
190
  key = case key
213
- when Integer
214
- [key]
215
- when String
216
- key.bytes
217
- else
218
- key
191
+ when Integer then [key]
192
+ when String then key.bytes
193
+ else key
219
194
  end
220
195
 
221
196
  key = key.cycle
@@ -249,22 +224,9 @@ class String
249
224
  #
250
225
  def base64_encode(mode=nil)
251
226
  case mode
252
- when :strict
253
- if RUBY_VERSION < '1.9'
254
- # backported from Ruby 1.9.2
255
- [self].pack("m")
256
- else
257
- Base64.strict_encode64(self)
258
- end
259
- when :url, :urlsafe
260
- if RUBY_VERSION < '1.9'
261
- # backported from Ruby 1.9.2
262
- [self].pack("m").tr("+/", "-_")
263
- else
264
- Base64.urlsafe_encode64(self)
265
- end
266
- else
267
- Base64.encode64(self)
227
+ when :strict then Base64.strict_encode64(self)
228
+ when :url, :urlsafe then Base64.urlsafe_encode64(self)
229
+ else Base64.encode64(self)
268
230
  end
269
231
  end
270
232
 
@@ -292,22 +254,9 @@ class String
292
254
  #
293
255
  def base64_decode(mode=nil)
294
256
  case mode
295
- when :strict
296
- if RUBY_VERSION < '1.9'
297
- # backported from Ruby 1.9.2
298
- unpack("m0").first
299
- else
300
- Base64.strict_decode64(self)
301
- end
302
- when :url, :urlsafe
303
- if RUBY_VERSION < '1.9'
304
- # backported from Ruby 1.9.2
305
- tr("-_", "+/").unpack("m0").first
306
- else
307
- Base64.urlsafe_decode64(self)
308
- end
309
- else
310
- Base64.decode64(self)
257
+ when :strict then Base64.strict_decode64(self)
258
+ when :url, :urlsafe then Base64.urlsafe_decode64(self)
259
+ else Base64.decode64(self)
311
260
  end
312
261
  end
313
262
 
@@ -362,108 +311,35 @@ class String
362
311
  # * `:octal_bytes`
363
312
  # * `:octal_shorts`
364
313
  # * `:octal_ints`
365
- # * `:octal_quads`
314
+ # * `:octal_quads` (Ruby 1.9 only)
366
315
  # * `:decimal`
367
316
  # * `:decimal_bytes`
368
317
  # * `:decimal_shorts`
369
318
  # * `:decimal_ints`
370
- # * `:decimal_quads`
319
+ # * `:decimal_quads` (Ruby 1.9 only)
371
320
  # * `:hex`
321
+ # * `:hex_chars`
372
322
  # * `:hex_bytes`
373
323
  # * `:hex_shorts`
374
324
  # * `:hex_ints`
375
325
  # * `:hex_quads`
326
+ # * `:named_chars` (Ruby 1.9 only)
327
+ # * `:floats`
328
+ # * `:doubles`
329
+ #
330
+ # @option options [:little, :big, :network] :endian (:little)
331
+ # The endianness of the words.
376
332
  #
377
333
  # @option options [Integer] :segment (16)
378
334
  # The length in bytes of each segment in the hexdump.
379
335
  #
380
- # @return [String] The raw-data from the hexdump.
336
+ # @return [String]
337
+ # The raw-data from the hexdump.
381
338
  #
382
339
  # @api public
383
340
  #
384
341
  def unhexdump(options={})
385
- case (format = options[:format])
386
- when :od
387
- address_base = 8
388
- base = 8
389
- word_size = 2
390
- when :hexdump
391
- address_base = 16
392
- base = 16
393
- word_size = 2
394
- else
395
- address_base = 16
396
- base = 16
397
- word_size = 1
398
- end
399
-
400
- case options[:encoding]
401
- when :binary
402
- base = 2
403
- when :octal, :octal_bytes, :octal_shorts, :octal_ints, :octal_quads
404
- base = 8
405
- when :decimal, :decimal_bytes, :decimal_shorts, :decimal_ints, :decimal_quads
406
- base = 10
407
- when :hex, :hex_bytes, :hex_shorts, :hex_ints, :hex_quads
408
- base = 16
409
- end
410
-
411
- case options[:encoding]
412
- when :binary, :octal_bytes, :decimal_bytes, :hex_bytes
413
- word_size = 1
414
- when :octal_shorts, :decimal_shorts, :hex_shorts
415
- word_size = 2
416
- when :octal_ints, :decimal_ints, :hex_ints
417
- word_size = 4
418
- when :octal_quads, :decimal_quads, :hex_quads
419
- word_size = 8
420
- end
421
-
422
- current_addr = last_addr = first_addr = nil
423
- repeated = false
424
-
425
- segment_length = (options[:segment] || 16)
426
- segment = []
427
- buffer = []
428
-
429
- each_line do |line|
430
- if format == :hexdump
431
- line = line.gsub(/\s+\|.+\|\s*$/,'')
432
- end
433
-
434
- words = line.split
435
-
436
- if words.first == '*'
437
- repeated = true
438
- elsif words.length > 0
439
- current_addr = words.shift.to_i(address_base)
440
- first_addr ||= current_addr
441
-
442
- if repeated
443
- (((current_addr - last_addr) / segment.length) - 1).times do
444
- buffer += segment
445
- end
446
-
447
- repeated = false
448
- end
449
-
450
- segment.clear
451
-
452
- words.each do |word|
453
- if (base != 10 && word =~ /^(\\[0abtnvfr\\]|.)$/)
454
- word.hex_unescape.each_byte { |b| segment << b }
455
- else
456
- segment += word.to_i(base).bytes(word_size)
457
- end
458
- end
459
-
460
- segment = segment[0,segment_length]
461
- buffer += segment
462
- last_addr = current_addr
463
- end
464
- end
465
-
466
- return buffer[0,(last_addr - first_addr)]
342
+ Ronin::Binary::Hexdump::Parser.new(options).parse(self)
467
343
  end
468
344
 
469
345
  end