From a1b4cf375fff7140e4b028248c8a044c8a02efd2 Mon Sep 17 00:00:00 2001 From: James Lee Date: Fri, 3 Apr 2015 00:11:41 -0500 Subject: [PATCH] Add some minimal specs for #generate --- spec/lib/msf/core/encoded_payload_spec.rb | 75 +++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/spec/lib/msf/core/encoded_payload_spec.rb b/spec/lib/msf/core/encoded_payload_spec.rb index 88926fa9d5..1a5c811da3 100644 --- a/spec/lib/msf/core/encoded_payload_spec.rb +++ b/spec/lib/msf/core/encoded_payload_spec.rb @@ -4,8 +4,23 @@ require 'msf/core/encoded_payload' describe Msf::EncodedPayload do include_context 'Msf::Simple::Framework#modules loading' + before do + expect_to_load_module_ancestors( + ancestor_reference_names: [ + # Excellent rank + 'x86/shikata_ga_nai', + # Great rank + 'x86/call4_dword_xor', + 'generic/none', + ], + module_type: 'encoder', + modules_path: modules_path, + ) + end + let(:ancestor_reference_names) { - %w{singles/linux/x86/shell_reverse_tcp} + # A module that doesn't require any datastore junk to generate + %w{singles/linux/x86/shell_bind_tcp} } let(:module_type) { @@ -13,7 +28,7 @@ describe Msf::EncodedPayload do } let(:reference_name) { - 'linux/x86/shell_reverse_tcp' + 'linux/x86/shell_bind_tcp' } let(:payload) { @@ -25,14 +40,26 @@ describe Msf::EncodedPayload do } subject(:encoded_payload) do - described_class.new(framework, payload, {}) + described_class.new(framework, payload, reqs) end + let(:badchars) { nil } + let(:reqs) { { 'BadChars' => badchars } } + it 'is an Msf::EncodedPayload' do expect(encoded_payload).to be_a(described_class) end describe '.create' do + subject(:encoded_payload) do + described_class.create(payload, { 'BadChars' => badchars } ) + end + + specify { expect(encoded_payload).to respond_to(:encoded) } + + it 'is an Msf::EncodedPayload' do + expect(encoded_payload).to be_a(described_class) + end context 'when passed a valid payload instance' do @@ -40,7 +67,7 @@ describe Msf::EncodedPayload do before { described_class.any_instance.stub(:generate) } it 'returns an Msf::EncodedPayload instance' do - expect(described_class.create(payload)).to be_a(described_class) + expect(encoded_payload).to be_a(described_class) end end @@ -76,4 +103,44 @@ describe Msf::EncodedPayload do end end end + + describe '#generate' do + let!(:generate) { encoded_payload.generate } + + context 'with no badchars' do + let(:badchars) { nil } + + specify 'returns the raw value' do + expect(encoded_payload.generate("RAW")).to eql("RAW") + end + + end + + context 'with bad characters: "\\0"' do + let(:badchars) { "\0".force_encoding('binary') } + + specify 'chooses x86/shikata_ga_nai' do + expect(encoded_payload.encoder.refname).to eq("x86/shikata_ga_nai") + end + + specify do + expect(encoded_payload.encoded).not_to include(badchars) + end + + end + context 'with bad characters: "\\xD9\\x00"' do + let(:badchars) { "\xD9\x00".force_encoding('binary') } + + specify 'chooses x86/call4_dword_xor' do + expect(encoded_payload.encoder.refname).to eq("x86/call4_dword_xor") + end + + specify do + expect(encoded_payload.encoded).not_to include(badchars) + end + + end + + end + end