d6bf0fd781
MSP-13484 Disabled expose_dsl_globally in spec_helper, so need to qualify top-level describe.
469 lines
17 KiB
Ruby
469 lines
17 KiB
Ruby
# -*- coding:binary -*-
|
|
require 'spec_helper'
|
|
|
|
require 'rex/java'
|
|
require 'stringio'
|
|
|
|
RSpec.describe Rex::Java::Serialization::Model::NewArray do
|
|
subject(:new_array) do
|
|
described_class.new
|
|
end
|
|
|
|
let(:boolean_array) do
|
|
"\x72\x00\x02\x5b\x5a\x57\x8f\x20" +
|
|
"\x39\x14\xb8\x5d\xe2\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x0a\x01\x00" +
|
|
"\x01\x01\x01\x01\x01\x01\x01\x00"
|
|
end
|
|
let(:boolean_array_io) { StringIO.new(boolean_array) }
|
|
|
|
let(:byte_array) do
|
|
"\x72\x00\x02\x5b\x42\xac\xf3\x17" +
|
|
"\xf8\x06\x08\x54\xe0\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\xec\x41"
|
|
end
|
|
let(:byte_array_io) { StringIO.new(byte_array) }
|
|
|
|
let(:char_array) do
|
|
"\x72\x00\x02\x5b\x43\xb0\x26\x66" +
|
|
"\xb0\xe2\x5d\x84\xac\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\x00\x61" +
|
|
"\x00\x62"
|
|
end
|
|
let(:char_array_io) { StringIO.new(char_array) }
|
|
|
|
let(:short_array) do
|
|
"\x72\x00\x02\x5b\x53\xef\x83\x2e" +
|
|
"\x06\xe5\x5d\xb0\xfa\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\xff\xec" +
|
|
"\x00\x41"
|
|
end
|
|
let(:short_array_io) { StringIO.new(short_array) }
|
|
|
|
let(:double_array) do
|
|
"\x72\x00\x02\x5b\x44\x3e\xa6\x8c" +
|
|
"\x14\xab\x63\x5a\x1e\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\x3f\xd0" +
|
|
"\x00\x00\x00\x00\x00\x00\x3f\xca" +
|
|
"\xe1\x47\xae\x14\x7a\xe1"
|
|
end
|
|
let(:double_array_io) { StringIO.new(double_array) }
|
|
|
|
let(:float_array) do
|
|
"\x72\x00\x02\x5b\x46\x0b\x9c\x81" +
|
|
"\x89\x22\xe0\x0c\x42\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\x3f\x80" +
|
|
"\x00\x00\x40\x00\x00\x00"
|
|
end
|
|
let(:float_array_io) { StringIO.new(float_array) }
|
|
|
|
let(:int_array) do
|
|
"\x72\x00\x02\x5b\x49\x4d\xba\x60" +
|
|
"\x26\x76\xea\xb2\xa5\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\xff\xff" +
|
|
"\xff\xec\x00\x00\x00\x41"
|
|
end
|
|
let(:int_array_io) { StringIO.new(int_array) }
|
|
|
|
let(:long_array) do
|
|
"\x72\x00\x02\x5b\x4a\x78\x20\x04" +
|
|
"\xb5\x12\xb1\x75\x93\x02\x00\x00" +
|
|
"\x78\x70\x00\x00\x00\x02\xff\xff" +
|
|
"\xff\xff\xff\xff\xff\xec\x00\x00" +
|
|
"\x00\x00\x00\x00\x00\x41"
|
|
end
|
|
let(:long_array_io) { StringIO.new(long_array) }
|
|
|
|
let(:string_array) do
|
|
"\x72\x00\x13\x5b\x4c\x6a\x61\x76" +
|
|
"\x61\x2e\x6c\x61\x6e\x67\x2e\x53" +
|
|
"\x74\x72\x69\x6e\x67\x3b\xad\xd2" +
|
|
"\x56\xe7\xe9\x1d\x7b\x47\x02\x00" +
|
|
"\x00\x78\x70\x00\x00\x00\x01\x74" +
|
|
"\x00\x03\x6d\x73\x66"
|
|
end
|
|
let(:string_array_io) { StringIO.new(string_array) }
|
|
|
|
describe ".new" do
|
|
it "Rex::Java::Serialization::Model::NewArray" do
|
|
expect(new_array).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "initializes array_description with nil" do
|
|
expect(new_array.array_description).to be_nil
|
|
end
|
|
|
|
it "initializes type with an empty String" do
|
|
expect(new_array.type).to be_empty
|
|
end
|
|
|
|
it "initializes values with an empty Array" do
|
|
expect(new_array.values).to be_empty
|
|
end
|
|
end
|
|
|
|
describe "#decode" do
|
|
|
|
context "when boolean Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(boolean_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(boolean_array_io)
|
|
expect(new_array.type).to eq('boolean')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(boolean_array_io)
|
|
expect(new_array.values).to eq([1, 0, 1, 1, 1, 1, 1, 1, 1, 0])
|
|
end
|
|
end
|
|
|
|
context "when byte Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(byte_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(byte_array_io)
|
|
expect(new_array.type).to eq('byte')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(byte_array_io)
|
|
expect(new_array.values).to eq([-20, 65])
|
|
end
|
|
end
|
|
|
|
context "when char Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(char_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(char_array_io)
|
|
expect(new_array.type).to eq('char')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(char_array_io)
|
|
expect(new_array.values).to eq([97, 98])
|
|
end
|
|
end
|
|
|
|
context "when short Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(short_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(short_array_io)
|
|
expect(new_array.type).to eq('short')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(short_array_io)
|
|
expect(new_array.values).to eq([-20, 65])
|
|
end
|
|
end
|
|
|
|
context "when double Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(double_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(double_array_io)
|
|
expect(new_array.type).to eq('double')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(double_array_io)
|
|
expect(new_array.values).to eq([0.25, 0.21])
|
|
end
|
|
end
|
|
|
|
context "when float Array" do
|
|
it "deserializes a float Array" do
|
|
expect(new_array.decode(float_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(float_array_io)
|
|
expect(new_array.type).to eq('float')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(float_array_io)
|
|
expect(new_array.values).to eq([1.0, 2.0])
|
|
end
|
|
end
|
|
|
|
context "when int Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(int_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(int_array_io)
|
|
expect(new_array.type).to eq('int')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(int_array_io)
|
|
expect(new_array.values).to eq([-20, 65])
|
|
end
|
|
end
|
|
|
|
context "when long Array" do
|
|
it "deserializes Array" do
|
|
expect(new_array.decode(long_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(long_array_io)
|
|
expect(new_array.type).to eq('long')
|
|
end
|
|
|
|
it "deserializes values correctly" do
|
|
new_array.decode(long_array_io)
|
|
expect(new_array.values).to eq([-20, 65])
|
|
end
|
|
end
|
|
|
|
context "when Strings (Objects) array" do
|
|
it "deserializes the array" do
|
|
expect(new_array.decode(string_array_io)).to be_a(Rex::Java::Serialization::Model::NewArray)
|
|
end
|
|
|
|
it "deserializes type correctly" do
|
|
new_array.decode(string_array_io)
|
|
expect(new_array.type).to eq('java.lang.String;')
|
|
end
|
|
|
|
it "deserializes number of members correctly" do
|
|
new_array.decode(string_array_io)
|
|
expect(new_array.values.length).to eq(1)
|
|
end
|
|
|
|
it "deserializes the members correctly" do
|
|
new_array.decode(string_array_io)
|
|
expect(new_array.values[0].contents).to eq('msf')
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
describe "#encode" do
|
|
it "serializes a boolean Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[Z')
|
|
new_class_desc.serial_version = 0x578f203914b85de2
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'boolean'
|
|
new_array.values = [1, 0, 1, 1, 1, 1, 1, 1, 1, 0]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(boolean_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a byte Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[B')
|
|
new_class_desc.serial_version = 0xacf317f8060854e0
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'byte'
|
|
new_array.values = [-20, 65]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(byte_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a char Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[C')
|
|
new_class_desc.serial_version = 0xb02666b0e25d84ac
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'char'
|
|
new_array.values = [97, 98]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(char_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a short Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[S')
|
|
new_class_desc.serial_version = 0xef832e06e55db0fa
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'short'
|
|
new_array.values = [-20, 65]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(short_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a double Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[D')
|
|
new_class_desc.serial_version = 0x3ea68c14ab635a1e
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'double'
|
|
new_array.values = [0.25, 0.21]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(double_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a float Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[F')
|
|
new_class_desc.serial_version = 0xb9c818922e00c42
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'float'
|
|
new_array.values = [1.0, 2.0]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(float_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a int Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[I')
|
|
new_class_desc.serial_version = 0x4dba602676eab2a5
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'int'
|
|
new_array.values = [-20, 65]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(int_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a long Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[J')
|
|
new_class_desc.serial_version = 0x782004b512b17593
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'long'
|
|
new_array.values = [-20, 65]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(long_array.unpack("C*"))
|
|
end
|
|
|
|
it "serializes a String (Objects) Array" do
|
|
new_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
|
|
new_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, '[Ljava.lang.String;')
|
|
new_class_desc.serial_version = 0xadd256e7e91d7b47
|
|
new_class_desc.flags = 2
|
|
new_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
|
|
new_class_desc.class_annotation.contents << Rex::Java::Serialization::Model::EndBlockData.new
|
|
new_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new
|
|
|
|
new_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
|
|
new_array.array_description.description = new_class_desc
|
|
new_array.type = 'java.lang.String;'
|
|
new_array.values = [ Rex::Java::Serialization::Model::Utf.new(nil, 'msf') ]
|
|
|
|
expect(new_array.encode.unpack("C*")).to eq(string_array.unpack("C*"))
|
|
end
|
|
end
|
|
|
|
describe "#to_s" do
|
|
it "prints a boolean array stream" do
|
|
new_array.decode(boolean_array_io)
|
|
expect(new_array.to_s).to eq('boolean, ["1", "0", "1", "1", "1", "1", "1", "1", "1", "0"]')
|
|
end
|
|
|
|
it "prints a byte array stream" do
|
|
new_array.decode(byte_array_io)
|
|
expect(new_array.to_s).to eq('byte, ["-20", "65"]')
|
|
end
|
|
|
|
it "prints a char array stream" do
|
|
new_array.decode(char_array_io)
|
|
expect(new_array.to_s).to eq('char, ["97", "98"]')
|
|
end
|
|
|
|
it "prints a short array stream" do
|
|
new_array.decode(short_array_io)
|
|
expect(new_array.to_s).to eq('short, ["-20", "65"]')
|
|
end
|
|
|
|
it "prints a double array stream" do
|
|
new_array.decode(double_array_io)
|
|
expect(new_array.to_s).to eq('double, ["0.25", "0.21"]')
|
|
end
|
|
|
|
it "prints a float array stream" do
|
|
new_array.decode(float_array_io)
|
|
expect(new_array.to_s).to eq('float, ["1.0", "2.0"]')
|
|
end
|
|
|
|
it "prints a int array stream" do
|
|
new_array.decode(int_array_io)
|
|
expect(new_array.to_s).to eq('int, ["-20", "65"]')
|
|
end
|
|
|
|
it "prints a long array stream" do
|
|
new_array.decode(long_array_io)
|
|
expect(new_array.to_s).to eq('long, ["-20", "65"]')
|
|
end
|
|
|
|
it "prints a string array stream" do
|
|
new_array.decode(string_array_io)
|
|
expect(new_array.to_s).to eq('java.lang.String;, ["msf"]')
|
|
end
|
|
end
|
|
|
|
end |