Skip to content

Commit 352535e

Browse files
committed
Land rapid7#6026, Add support for NewClass elements on Rex::Java::Serialization
2 parents 421ed38 + bfbd6ad commit 352535e

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

lib/rex/java/serialization/model.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module Model
1919
autoload :NewClassDesc, 'rex/java/serialization/model/new_class_desc'
2020
autoload :NewEnum, 'rex/java/serialization/model/new_enum'
2121
autoload :NewObject, 'rex/java/serialization/model/new_object'
22+
autoload :NewClass, 'rex/java/serialization/model/new_class'
2223
autoload :NullReference, 'rex/java/serialization/model/null_reference'
2324
autoload :Reference, 'rex/java/serialization/model/reference'
2425
autoload :Reset, 'rex/java/serialization/model/reset'

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def decode_content(io, stream)
2828
when TC_OBJECT
2929
content = NewObject.decode(io, stream)
3030
when TC_CLASS
31-
content = ClassDesc.decode(io, stream)
31+
content = NewClass.decode(io, stream)
3232
when TC_ARRAY
3333
content = NewArray.decode(io, stream)
3434
when TC_STRING
@@ -75,7 +75,7 @@ def encode_content(content)
7575
encoded << [TC_ENDBLOCKDATA].pack('C')
7676
when NewObject
7777
encoded << [TC_OBJECT].pack('C')
78-
when ClassDesc
78+
when NewClass
7979
encoded << [TC_CLASS].pack('C')
8080
when NewArray
8181
encoded << [TC_ARRAY].pack('C')
@@ -122,6 +122,8 @@ def print_content(content)
122122
str << "#{print_class(content)} { #{content.to_s} }"
123123
when ClassDesc
124124
str << "#{print_class(content)} { #{content.to_s} }"
125+
when NewClass
126+
str << "#{print_class(content)} { #{content.to_s} }"
125127
when NewArray
126128
str << "#{print_class(content)} { #{content.to_s} }"
127129
when Utf
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# -*- coding: binary -*-
2+
3+
module Rex
4+
module Java
5+
module Serialization
6+
module Model
7+
# This class provides a NewArray (Java Array) representation
8+
class NewClass < Element
9+
10+
include Rex::Java::Serialization::Model::Contents
11+
12+
# @!attribute array_description
13+
# @return [Java::Serialization::Model::ClassDesc] The description of the class
14+
attr_accessor :class_description
15+
16+
# @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
17+
def initialize(stream = nil)
18+
super(stream)
19+
self.class_description = nil
20+
end
21+
22+
# Deserializes a Rex::Java::Serialization::Model::NewClass
23+
#
24+
# @param io [IO] the io to read from
25+
# @return [self] if deserialization succeeds
26+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
27+
def decode(io)
28+
self.class_description = ClassDesc.decode(io, stream)
29+
stream.add_reference(self) unless stream.nil?
30+
31+
self
32+
end
33+
34+
# Serializes the Rex::Java::Serialization::Model::NewClass
35+
#
36+
# @return [String] if serialization succeeds
37+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
38+
def encode
39+
unless class_description.kind_of?(ClassDesc)
40+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize NewClass'
41+
end
42+
43+
encoded = ''
44+
encoded << class_description.encode
45+
end
46+
47+
# Creates a print-friendly string representation
48+
#
49+
# @return [String]
50+
def to_s
51+
print_content(class_description)
52+
end
53+
end
54+
end
55+
end
56+
end
57+
end

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def encode
7171
# @return [String]
7272
def to_s
7373
str = ''
74+
7475
case class_desc.description
7576
when NewClassDesc
7677
str << class_desc.description.class_name.to_s
@@ -84,6 +85,8 @@ def to_s
8485
data_str = class_data.collect { |data| data.to_s }
8586
str << data_str.join(', ')
8687
str << ' }'
88+
89+
str
8790
end
8891

8992
private

0 commit comments

Comments
 (0)