Skip to content

Commit 785006b

Browse files
committed
Use references
1 parent ae608b1 commit 785006b

File tree

7 files changed

+16
-10
lines changed

7 files changed

+16
-10
lines changed

lib/rex/java/serialization/model/class_desc.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def decode(io)
2828
end
2929

3030
self.description = content
31-
stream.add_reference(self) unless stream.nil?
3231
self
3332
end
3433

lib/rex/java/serialization/model/contents.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ def decode_content(io, stream)
3131
content = NewArray.decode(io, stream)
3232
when TC_STRING
3333
content = Utf.decode(io, stream)
34+
stream.add_reference(content) unless stream.nil?
3435
when TC_LONGSTRING
3536
content = LongUtf.decode(io, stream)
37+
stream.add_reference(content) unless stream.nil?
3638
when TC_ENUM
3739
content = NewEnum.decode(io, stream)
3840
when TC_CLASSDESC

lib/rex/java/serialization/model/long_utf.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class LongUtf < Utf
1111
# @return [self] if deserialization succeeds
1212
# @return [nil] if deserialization doesn't succeed
1313
def decode(io)
14-
stream.add_reference(self) unless stream.nil?
1514
raw_length = io.read(8)
1615
if raw_length.nil? || raw_length.length != 8
1716
raise ::RuntimeError, 'Failed to unserialize LongUtf'

lib/rex/java/serialization/model/new_class_desc.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def initialize(stream = nil)
4444
def decode(io)
4545
self.class_name = Utf.decode(io, stream)
4646
self.serial_version = decode_serial_version(io)
47+
stream.add_reference(self) unless stream.nil?
4748
self.flags = decode_flags(io)
4849
fields_length = decode_fields_length(io)
4950
fields_length.times do

lib/rex/java/serialization/model/new_object.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ def initialize(stream = nil)
2828
def decode(io)
2929
self.class_desc = ClassDesc.decode(io, stream)
3030
stream.add_reference(self) unless stream.nil?
31+
3132
if class_desc.description.class == Rex::Java::Serialization::Model::NewClassDesc
32-
self.class_data = decode_class_data(io, class_desc)
33+
self.class_data = decode_class_data(io, class_desc.description)
34+
elsif class_desc.description.class == Rex::Java::Serialization::Model::Reference
35+
ref = class_desc.description.handler - BASE_WIRE_HANDLE
36+
self.class_data = decode_class_data(io, stream.references[ref])
3337
end
3438

3539
self
@@ -59,14 +63,14 @@ def encode
5963
# Deserializes the class_data for a class_desc and its super classes
6064
#
6165
# @param io [IO] the io to read from
62-
# @param my_class_desc [Rex::Java::Serialization::Model::ClassDesc] the class_desc whose data is being extracted
66+
# @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
6367
# @return [Array] class_data values if deserialization succeeds
6468
# @raise [RuntimeError] if deserialization doesn't succeed
6569
def decode_class_data(io, my_class_desc)
6670
values = []
6771

68-
unless my_class_desc.description.super_class.description.class == Rex::Java::Serialization::Model::NullReference
69-
values += decode_class_data(io, my_class_desc.description.super_class)
72+
unless my_class_desc.super_class.description.class == Rex::Java::Serialization::Model::NullReference
73+
values += decode_class_data(io, my_class_desc.super_class.description)
7074
end
7175

7276
values += decode_class_fields(io, my_class_desc)
@@ -77,13 +81,13 @@ def decode_class_data(io, my_class_desc)
7781
# Deserializes the fields data for a class_desc
7882
#
7983
# @param io [IO] the io to read from
80-
# @param my_class_desc [Rex::Java::Serialization::Model::ClassDesc] the class_desc whose data is being extracted
84+
# @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
8185
# @return [Array] class_data values if deserialization succeeds
8286
# @raise [RuntimeError] if deserialization doesn't succeed
8387
def decode_class_fields(io, my_class_desc)
8488
values = []
8589

86-
my_class_desc.description.fields.each do |field|
90+
my_class_desc.fields.each do |field|
8791
if field.is_primitive?
8892
values << decode_value(io, field.type)
8993
else

lib/rex/java/serialization/model/reference.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ def decode(io)
1717
raise ::RuntimeError, 'Failed to unserialize Reference'
1818
end
1919

20-
handler_raw.unpack('N')[0]
20+
self.handler = handler_raw.unpack('N')[0]
21+
22+
self
2123
end
2224
end
2325
end

lib/rex/java/serialization/model/utf.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def initialize(stream = nil, contents = '')
2525
# @return [self] if deserialization succeeds
2626
# @raise [RuntimeError] if deserialization doesn't succeed
2727
def decode(io)
28-
stream.add_reference(self) unless stream.nil?
2928
raw_length = io.read(2)
3029
if raw_length.nil? || raw_length.length != 2
3130
raise ::RuntimeError, 'Failed to unserialize Utf'

0 commit comments

Comments
 (0)