|
4 | 4 | describe Msf::EncodedPayload do
|
5 | 5 | include_context 'Msf::Simple::Framework#modules loading'
|
6 | 6 |
|
| 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 | + |
7 | 21 | 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} |
9 | 24 | }
|
10 | 25 |
|
11 | 26 | let(:module_type) {
|
12 | 27 | 'payload'
|
13 | 28 | }
|
14 | 29 |
|
15 | 30 | let(:reference_name) {
|
16 |
| - 'linux/x86/shell_reverse_tcp' |
| 31 | + 'linux/x86/shell_bind_tcp' |
17 | 32 | }
|
18 | 33 |
|
19 | 34 | let(:payload) {
|
|
25 | 40 | }
|
26 | 41 |
|
27 | 42 | subject(:encoded_payload) do
|
28 |
| - described_class.new(framework, payload, {}) |
| 43 | + described_class.new(framework, payload, reqs) |
29 | 44 | end
|
30 | 45 |
|
| 46 | + let(:badchars) { nil } |
| 47 | + let(:reqs) { { 'BadChars' => badchars } } |
| 48 | + |
31 | 49 | it 'is an Msf::EncodedPayload' do
|
32 | 50 | expect(encoded_payload).to be_a(described_class)
|
33 | 51 | end
|
34 | 52 |
|
35 | 53 | 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 |
36 | 63 |
|
37 | 64 | context 'when passed a valid payload instance' do
|
38 | 65 |
|
39 | 66 | # don't ever actually generate payload bytes
|
40 | 67 | before { described_class.any_instance.stub(:generate) }
|
41 | 68 |
|
42 | 69 | 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) |
44 | 71 | end
|
45 | 72 |
|
46 | 73 | end
|
|
76 | 103 | end
|
77 | 104 | end
|
78 | 105 | 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 | + |
79 | 146 | end
|
0 commit comments