ronin-support 0.5.0 → 0.5.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.
Files changed (38) hide show
  1. data/ChangeLog.md +13 -1
  2. data/README.md +5 -3
  3. data/lib/ronin/binary/hexdump/parser.rb +10 -18
  4. data/lib/ronin/binary/struct.rb +18 -32
  5. data/lib/ronin/binary/template.rb +29 -19
  6. data/lib/ronin/extensions/ip_addr.rb +5 -10
  7. data/lib/ronin/extensions/resolv.rb +2 -4
  8. data/lib/ronin/formatting/extensions/binary.rb +1 -0
  9. data/lib/ronin/formatting/extensions/binary/array.rb +5 -7
  10. data/lib/ronin/formatting/extensions/binary/float.rb +4 -4
  11. data/lib/ronin/formatting/extensions/binary/integer.rb +14 -11
  12. data/lib/ronin/formatting/extensions/binary/string.rb +14 -25
  13. data/lib/ronin/formatting/extensions/html/integer.rb +4 -8
  14. data/lib/ronin/formatting/extensions/html/string.rb +24 -32
  15. data/lib/ronin/formatting/extensions/sql/string.rb +9 -13
  16. data/lib/ronin/formatting/extensions/text/array.rb +8 -6
  17. data/lib/ronin/formatting/extensions/text/string.rb +4 -8
  18. data/lib/ronin/fuzzing/fuzzer.rb +8 -16
  19. data/lib/ronin/network/dns.rb +2 -4
  20. data/lib/ronin/network/ftp.rb +5 -1
  21. data/lib/ronin/network/ssl.rb +9 -10
  22. data/lib/ronin/network/tcp/tcp.rb +8 -0
  23. data/lib/ronin/network/udp/proxy.rb +2 -2
  24. data/lib/ronin/network/udp/udp.rb +8 -0
  25. data/lib/ronin/network/unix.rb +4 -5
  26. data/lib/ronin/path.rb +2 -2
  27. data/lib/ronin/support/version.rb +1 -1
  28. data/lib/ronin/ui/output/helpers.rb +2 -4
  29. data/lib/ronin/ui/shell.rb +3 -6
  30. data/spec/binary/template_spec.rb +14 -0
  31. data/spec/formatting/binary/array_spec.rb +8 -4
  32. data/spec/formatting/binary/float_spec.rb +8 -4
  33. data/spec/formatting/binary/integer_spec.rb +16 -4
  34. data/spec/formatting/binary/string_spec.rb +8 -4
  35. data/spec/network/ftp_spec.rb +16 -0
  36. data/spec/network/network_spec.rb +1 -1
  37. data/spec/network/ssl_spec.rb +50 -0
  38. metadata +359 -399
@@ -1,5 +1,18 @@
1
+ ### 0.5.1 / 2012-06-29
2
+
3
+ * Added {Ronin::Binary::Template#inspect}.
4
+ * Added the `:passive` option to {Ronin::Network::FTP#ftp_connect}.
5
+ * Forgot to require `ronin/formatting/extensions/binary/array`.
6
+ * Fixed a bug where {Array#pack} would not accept tuples (ex: `[:uint8, 2]`).
7
+ * Fixed a bug in {String#sql_decode} where `"\\'\\'"` would incorrectly be
8
+ converted to `'"'`.
9
+ * Ensure that {Integer#pack} only accepts one argument.
10
+ * Have {String#hex_unescape} to decode every two characters.
11
+ * Enable passive-mode by default in {Ronin::Network::FTP#ftp_connect}.
12
+
1
13
  ### 0.5.0 / 2012-06-16
2
14
 
15
+ * Require uri-query_params ~> 0.6.
3
16
  * Added {Float#pack}.
4
17
  * Added {Regexp::WORD}.
5
18
  * Added {Regexp::PHONE_NUMBER}.
@@ -51,7 +64,6 @@
51
64
  * {Ronin::Fuzzing.[]} now raises a `NoMethodError` for unknown fuzzing methods.
52
65
  * Use `module_function` in {Ronin::Fuzzing}, so the generator methods can be
53
66
  included into other Classes/Modules.
54
- * Require uri-query_params ~> 0.6.
55
67
  * Use `$stdout` instead of calling `Kernel.puts` or `STDOUT`.
56
68
  Prevents infinite recursion if another library overrides `Kernel.puts`.
57
69
  * Allow {Ronin::Network::DNS} methods to yield resolved addresses.
data/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  * [Source](https://github.com/ronin-ruby/ronin-support)
4
4
  * [Issues](https://github.com/ronin-ruby/ronin-support/issues)
5
5
  * [Documentation](http://ronin-ruby.github.com/docs/ronin-support/frames)
6
- * [Mailing List](http://groups.google.com/group/ronin-ruby)
7
- * [irc.freenode.net #ronin](http://webchat.freenode.net/?channels=ronin&uio=Mj10cnVldd)
6
+ * [Mailing List](https://groups.google.com/group/ronin-ruby)
7
+ * [irc.freenode.net #ronin](http://ronin-ruby.github.com/irc/)
8
8
 
9
9
  ## Description
10
10
 
@@ -21,17 +21,19 @@ or payloads over many common Source-Code-Management (SCM) systems.
21
21
  * Formatting data:
22
22
  * Binary
23
23
  * Text
24
- * HTTP
25
24
  * URIs
25
+ * HTTP
26
26
  * HTML
27
27
  * JavaScript
28
28
  * SQL
29
29
  * Fuzzing
30
30
  * Networking:
31
31
  * DNS
32
+ * UNIX
32
33
  * TCP
33
34
  * UDP
34
35
  * SSL
36
+ * FTP
35
37
  * SMTP / ESMTP
36
38
  * POP3
37
39
  * Imap
@@ -137,10 +137,8 @@ module Ronin
137
137
  @encoding = options[:encoding]
138
138
 
139
139
  @type = case @encoding
140
- when :floats, :doubles
141
- :float
142
- else
143
- :integer
140
+ when :floats, :doubles then :float
141
+ else :integer
144
142
  end
145
143
  @endian = options.fetch(:endian,:little)
146
144
 
@@ -164,12 +162,10 @@ module Ronin
164
162
  @word_size = WORD_SIZES.fetch(options[:encoding])
165
163
  end
166
164
 
167
- case @encoding
168
- when :hex_chars
169
- @chars = CHARS.merge(ESCAPED_CHARS)
170
- when :named_chars
171
- @chars = CHARS.merge(NAMED_CHARS)
172
- end
165
+ @chars = case @encoding
166
+ when :hex_chars then CHARS.merge(ESCAPED_CHARS)
167
+ when :named_chars then CHARS.merge(NAMED_CHARS)
168
+ end
173
169
  end
174
170
 
175
171
  #
@@ -352,10 +348,8 @@ module Ronin
352
348
  # @api private
353
349
  #
354
350
  def parse_int(int)
355
- if @chars
356
- parse_char(int)
357
- else
358
- int.to_i(@base)
351
+ if @chars then parse_char(int)
352
+ else int.to_i(@base)
359
353
  end
360
354
  end
361
355
 
@@ -383,10 +377,8 @@ module Ronin
383
377
  #
384
378
  def parse_word(word)
385
379
  case @type
386
- when :integer
387
- parse_int(word)
388
- when :float
389
- parse_float(word)
380
+ when :integer then parse_int(word)
381
+ when :float then parse_float(word)
390
382
  end
391
383
  end
392
384
 
@@ -39,7 +39,7 @@ module Ronin
39
39
  #
40
40
  # pkt = Packet.new
41
41
  # pkt.length = 5
42
- # pkt.data = 'hello'
42
+ # pkt.data = 'hello'
43
43
  #
44
44
  # buffer = pkt.pack
45
45
  # # => "\x00\x00\x00\x05hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
@@ -96,7 +96,7 @@ module Ronin
96
96
  # Unpacking options.
97
97
  #
98
98
  # @option options [:little, :big, :network] :endian
99
- # The endianness to apply to types.
99
+ # The endianness to apply to the types.
100
100
  #
101
101
  # @return [Struct]
102
102
  # The newly unpacked structure.
@@ -131,10 +131,8 @@ module Ronin
131
131
  # The structure does not contain the field.
132
132
  #
133
133
  def [](name)
134
- if field?(name)
135
- send(name)
136
- else
137
- raise(ArgumentError,"no such field '#{name}'")
134
+ if field?(name) then send(name)
135
+ else raise(ArgumentError,"no such field '#{name}'")
138
136
  end
139
137
  end
140
138
 
@@ -154,10 +152,8 @@ module Ronin
154
152
  # The structure does not contain the field.
155
153
  #
156
154
  def []=(name,value)
157
- if field?(name)
158
- send("#{name}=",value)
159
- else
160
- raise(ArgumentError,"no such field '#{name}'")
155
+ if field?(name) then send("#{name}=",value)
156
+ else raise(ArgumentError,"no such field '#{name}'")
161
157
  end
162
158
  end
163
159
 
@@ -170,19 +166,15 @@ module Ronin
170
166
  def values
171
167
  normalize = lambda { |value|
172
168
  case value
173
- when Struct
174
- value.values
175
- else
176
- value
169
+ when Struct then value.values
170
+ else value
177
171
  end
178
172
  }
179
173
 
180
174
  self.class.layout.map do |name|
181
175
  case (value = self[name])
182
- when Array
183
- value.map(&normalize)
184
- else
185
- normalize[value]
176
+ when Array then value.map(&normalize)
177
+ else normalize[value]
186
178
  end
187
179
  end
188
180
  end
@@ -208,7 +200,7 @@ module Ronin
208
200
  # Pack options.
209
201
  #
210
202
  # @option options [:little, :big, :network] :endian
211
- # The endianness to apply to types.
203
+ # The endianness to apply to the types.
212
204
  #
213
205
  # @return [String]
214
206
  # The packed structure.
@@ -227,7 +219,7 @@ module Ronin
227
219
  # Unpack options.
228
220
  #
229
221
  # @option options [:little, :big, :network] :endian
230
- # The endianness to apply to types.
222
+ # The endianness to apply to the types.
231
223
  #
232
224
  # @return [Struct]
233
225
  # The unpacked structure.
@@ -383,10 +375,8 @@ module Ronin
383
375
  # The endianness of the structure.
384
376
  #
385
377
  def self.endian(type=nil)
386
- if type
387
- @endian = type.to_sym
388
- else
389
- @endian
378
+ if type then @endian = type.to_sym
379
+ else @endian
390
380
  end
391
381
  end
392
382
 
@@ -484,14 +474,10 @@ module Ronin
484
474
  end
485
475
  else
486
476
  if type.kind_of?(Symbol)
487
- if Template::INT_TYPES.include?(type)
488
- 0
489
- elsif Template::FLOAT_TYPES.include?(type)
490
- 0.0
491
- elsif Template::CHAR_TYPES.include?(type)
492
- "\0"
493
- elsif Template::STRING_TYPES.include?(type)
494
- ''
477
+ if Template::INT_TYPES.include?(type) then 0
478
+ elsif Template::FLOAT_TYPES.include?(type) then 0.0
479
+ elsif Template::CHAR_TYPES.include?(type) then "\0"
480
+ elsif Template::STRING_TYPES.include?(type) then ''
495
481
  end
496
482
  elsif type < Struct
497
483
  type.new
@@ -22,7 +22,7 @@ require 'set'
22
22
  module Ronin
23
23
  module Binary
24
24
  #
25
- # Provides a translation layer between C types and Ruby `Array#pack`
25
+ # Provides a translation layer between C-types and Ruby `Array#pack`
26
26
  # codes.
27
27
  #
28
28
  # ## Types
@@ -60,7 +60,7 @@ module Ronin
60
60
  # * `:byte` (`c`) - signed byte.
61
61
  # * `:string` (`Z*`) - binary String, `\0` terminated.
62
62
  #
63
- # ### Ruby 1.9 specific types
63
+ # ### Ruby 1.9 specific C-types
64
64
  #
65
65
  # * `:uint16_le` (`S<`) - unsigned 16-bit integer, little endian.
66
66
  # * `:uint32_le` (`L<`) - unsigned 32-bit integer, little endian.
@@ -99,7 +99,7 @@ module Ronin
99
99
  #
100
100
  class Template
101
101
 
102
- # Supported types and corresponding `Array#pack` codes.
102
+ # Supported C-types and corresponding `Array#pack` codes.
103
103
  TYPES = {
104
104
  :uint8 => 'C',
105
105
  :uint16 => 'S',
@@ -144,7 +144,7 @@ module Ronin
144
144
  :string => 'Z*'
145
145
  }
146
146
 
147
- # Additional types, not available on Ruby 1.8:
147
+ # Additional C-types, not available on Ruby 1.8:
148
148
  if RUBY_VERSION > '1.9.'
149
149
  TYPES.merge!(
150
150
  :uint16_le => 'S<',
@@ -185,7 +185,7 @@ module Ronin
185
185
  )
186
186
  end
187
187
 
188
- # Integer types
188
+ # Integer C-types
189
189
  INT_TYPES = Set[
190
190
  :uint8,
191
191
  :uint16,
@@ -246,17 +246,17 @@ module Ronin
246
246
  :long_long_be
247
247
  ]
248
248
 
249
- # Float types
249
+ # Float C-types
250
250
  FLOAT_TYPES = Set[
251
251
  :float, :double,
252
252
  :float_le, :double_le,
253
253
  :float_be, :double_be
254
254
  ]
255
255
 
256
- # Character types
256
+ # Character C-types
257
257
  CHAR_TYPES = Set[:uchar, :char]
258
258
 
259
- # String types
259
+ # String C-types
260
260
  STRING_TYPES = CHAR_TYPES + Set[:string]
261
261
 
262
262
  # Types which have little and big endian forms
@@ -275,19 +275,19 @@ module Ronin
275
275
  # Creates a new Binary Template.
276
276
  #
277
277
  # @param [Array<type, (type, length)>] fields
278
- # The types which the packer will use.
278
+ # The C-types which the packer will use.
279
279
  #
280
280
  # @param [Hash] options
281
281
  # Template options.
282
282
  #
283
283
  # @option options [:little, :big, :network] :endian
284
- # The endianness to apply to types.
284
+ # The endianness to apply to the C-types.
285
285
  #
286
286
  # @raise [ArgumentError]
287
287
  # A given type is not known.
288
288
  #
289
289
  # @note
290
- # The following types are **not supported** on Ruby 1.8:
290
+ # The following C-types are **not supported** on Ruby 1.8:
291
291
  #
292
292
  # * `:uint16_le`
293
293
  # * `:uint32_le`
@@ -343,7 +343,7 @@ module Ronin
343
343
  # Translation options.
344
344
  #
345
345
  # @option options [:little, :big, :network] :endian
346
- # The endianness to apply to types.
346
+ # The endianness to apply to the C-types.
347
347
  #
348
348
  # @return [Symbol]
349
349
  # The translated type.
@@ -354,10 +354,8 @@ module Ronin
354
354
  def self.translate(type,options={})
355
355
  if (options[:endian] && ENDIAN_TYPES.include?(type))
356
356
  type = case options[:endian]
357
- when :little
358
- :"#{type}_le"
359
- when :big, :network
360
- :"#{type}_be"
357
+ when :little then :"#{type}_le"
358
+ when :big, :network then :"#{type}_be"
361
359
  else
362
360
  raise(ArgumentError,"unknown endianness: #{type}")
363
361
  end
@@ -367,17 +365,17 @@ module Ronin
367
365
  end
368
366
 
369
367
  #
370
- # Compiles binary types into an `Array#pack` / `String#unpack`
368
+ # Compiles C-types into an `Array#pack` / `String#unpack`
371
369
  # template.
372
370
  #
373
371
  # @param [Array<type, (type, length)>] types
374
- # The types which the packer will use.
372
+ # The C-types which the packer will use.
375
373
  #
376
374
  # @param [Hash] options
377
375
  # Type options.
378
376
  #
379
377
  # @option options [:little, :big, :network] :endian
380
- # The endianness to apply to types.
378
+ # The endianness to apply to the C-types.
381
379
  #
382
380
  # @return [String]
383
381
  # The `Array#pack` / `String#unpack` template.
@@ -439,6 +437,18 @@ module Ronin
439
437
  @template
440
438
  end
441
439
 
440
+ #
441
+ # Inspects the template.
442
+ #
443
+ # @return [String]
444
+ # The inspected template.
445
+ #
446
+ # @since 1.5.1
447
+ #
448
+ def inspect
449
+ "<#{self.class}: #{@fields.inspect}>"
450
+ end
451
+
442
452
  end
443
453
  end
444
454
  end
@@ -66,12 +66,9 @@ class IPAddr
66
66
  return enum_for(__method__,text,version).to_a unless block_given?
67
67
 
68
68
  regexp = case version
69
- when :ipv4, :v4, 4
70
- Regexp::IPv4
71
- when :ipv6, :v6, 6
72
- Regexp::IPv6
73
- else
74
- Regexp::IP
69
+ when :ipv4, :v4, 4 then Regexp::IPv4
70
+ when :ipv6, :v6, 6 then Regexp::IPv6
71
+ else Regexp::IP
75
72
  end
76
73
 
77
74
  text.scan(regexp) do |match|
@@ -128,10 +125,8 @@ class IPAddr
128
125
  separator = '::'
129
126
  base = 16
130
127
 
131
- prefix = if cidr_or_glob.start_with?('::')
132
- '::'
133
- else
134
- ''
128
+ prefix = if cidr_or_glob.start_with?('::') then '::'
129
+ else ''
135
130
  end
136
131
 
137
132
  format = lambda { |address|
@@ -70,10 +70,8 @@ class Resolv
70
70
  # @api public
71
71
  #
72
72
  def Resolv.resolver(nameserver=nil)
73
- if nameserver
74
- DNS.new(:nameserver => nameserver)
75
- else
76
- self
73
+ if nameserver then DNS.new(:nameserver => nameserver)
74
+ else self
77
75
  end
78
76
  end
79
77
 
@@ -20,6 +20,7 @@
20
20
  require 'ronin/formatting/extensions/binary/integer'
21
21
  require 'ronin/formatting/extensions/binary/float'
22
22
  require 'ronin/formatting/extensions/binary/string'
23
+ require 'ronin/formatting/extensions/binary/array'
23
24
  require 'ronin/formatting/extensions/binary/file'
24
25
 
25
26
  require 'hexdump/extensions'
@@ -26,14 +26,14 @@ class Array
26
26
  #
27
27
  # Packs the Array into a String.
28
28
  #
29
- # @param [String, Array<Symbol>] arguments
29
+ # @param [String, Array<Symbol, (Symbol, Integer)>] arguments
30
30
  # The `Array#pack` template or a list of {Ronin::Binary::Template} types.
31
31
  #
32
32
  # @return [String]
33
33
  # The packed Array.
34
34
  #
35
35
  # @raise [ArgumentError]
36
- # The arguments were not a String or a list of Symbols.
36
+ # One of the arguments was not a known {Ronin::Binary::Template} type.
37
37
  #
38
38
  # @example using {Ronin::Binary::Template} types:
39
39
  # [0x1234, "hello"].pack(:uint16_le, :string)
@@ -44,19 +44,17 @@ class Array
44
44
  # # => "\x34\x12hello\0"
45
45
  #
46
46
  # @see http://rubydoc.info/stdlib/core/Array:pack
47
+ # @see Ronin::Binary::Template
47
48
  #
48
49
  # @since 0.5.0
49
50
  #
50
51
  # @api public
51
52
  #
52
53
  def pack(*arguments)
53
- case arguments.first
54
- when String
54
+ if (arguments.length == 1 && arguments.first.kind_of?(String))
55
55
  pack_original(arguments.first)
56
- when Symbol
57
- pack_original(Ronin::Binary::Template.compile(arguments))
58
56
  else
59
- raise(ArgumentError,"first argument to Array#pack must be a String or Symbol")
57
+ pack_original(Ronin::Binary::Template.compile(arguments))
60
58
  end
61
59
  end
62
60