Skip to content

Commit d02a4cc

Browse files
committed
Land rapid7#5066 : EncodedPayload#generate specs
2 parents 16cb334 + a1b4cf3 commit d02a4cc

File tree

1 file changed

+71
-4
lines changed

1 file changed

+71
-4
lines changed

spec/lib/msf/core/encoded_payload_spec.rb

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,31 @@
44
describe Msf::EncodedPayload do
55
include_context 'Msf::Simple::Framework#modules loading'
66

7+
before do
8+
expect_to_load_module_ancestors(
9+
ancestor_reference_names: [
10+
# Excellent rank
11+
'x86/shikata_ga_nai',
12+
# Great rank
13+
'x86/call4_dword_xor',
14+
'generic/none',
15+
],
16+
module_type: 'encoder',
17+
modules_path: modules_path,
18+
)
19+
end
20+
721
let(:ancestor_reference_names) {
8-
%w{singles/linux/x86/shell_reverse_tcp}
22+
# A module that doesn't require any datastore junk to generate
23+
%w{singles/linux/x86/shell_bind_tcp}
924
}
1025

1126
let(:module_type) {
1227
'payload'
1328
}
1429

1530
let(:reference_name) {
16-
'linux/x86/shell_reverse_tcp'
31+
'linux/x86/shell_bind_tcp'
1732
}
1833

1934
let(:payload) {
@@ -25,22 +40,34 @@
2540
}
2641

2742
subject(:encoded_payload) do
28-
described_class.new(framework, payload, {})
43+
described_class.new(framework, payload, reqs)
2944
end
3045

46+
let(:badchars) { nil }
47+
let(:reqs) { { 'BadChars' => badchars } }
48+
3149
it 'is an Msf::EncodedPayload' do
3250
expect(encoded_payload).to be_a(described_class)
3351
end
3452

3553
describe '.create' do
54+
subject(:encoded_payload) do
55+
described_class.create(payload, { 'BadChars' => badchars } )
56+
end
57+
58+
specify { expect(encoded_payload).to respond_to(:encoded) }
59+
60+
it 'is an Msf::EncodedPayload' do
61+
expect(encoded_payload).to be_a(described_class)
62+
end
3663

3764
context 'when passed a valid payload instance' do
3865

3966
# don't ever actually generate payload bytes
4067
before { described_class.any_instance.stub(:generate) }
4168

4269
it 'returns an Msf::EncodedPayload instance' do
43-
expect(described_class.create(payload)).to be_a(described_class)
70+
expect(encoded_payload).to be_a(described_class)
4471
end
4572

4673
end
@@ -76,4 +103,44 @@
76103
end
77104
end
78105
end
106+
107+
describe '#generate' do
108+
let!(:generate) { encoded_payload.generate }
109+
110+
context 'with no badchars' do
111+
let(:badchars) { nil }
112+
113+
specify 'returns the raw value' do
114+
expect(encoded_payload.generate("RAW")).to eql("RAW")
115+
end
116+
117+
end
118+
119+
context 'with bad characters: "\\0"' do
120+
let(:badchars) { "\0".force_encoding('binary') }
121+
122+
specify 'chooses x86/shikata_ga_nai' do
123+
expect(encoded_payload.encoder.refname).to eq("x86/shikata_ga_nai")
124+
end
125+
126+
specify do
127+
expect(encoded_payload.encoded).not_to include(badchars)
128+
end
129+
130+
end
131+
context 'with bad characters: "\\xD9\\x00"' do
132+
let(:badchars) { "\xD9\x00".force_encoding('binary') }
133+
134+
specify 'chooses x86/call4_dword_xor' do
135+
expect(encoded_payload.encoder.refname).to eq("x86/call4_dword_xor")
136+
end
137+
138+
specify do
139+
expect(encoded_payload.encoded).not_to include(badchars)
140+
end
141+
142+
end
143+
144+
end
145+
79146
end

0 commit comments

Comments
 (0)