Skip to content

Commit 12e3cb3

Browse files
committed
Land rapid7#3764 - Add specs for Rex::Encoder::NonAlpha
2 parents 54c353a + f521cc5 commit 12e3cb3

File tree

2 files changed

+146
-4
lines changed

2 files changed

+146
-4
lines changed

lib/rex/encoder/nonalpha.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Encoder
77

88
class NonAlpha
99

10-
def NonAlpha.gen_decoder()
10+
def NonAlpha.gen_decoder
1111
decoder =
1212
"\x66\xB9\xFF\xFF" +
1313
"\xEB\x19" + # Jmp to table
@@ -28,13 +28,13 @@ def NonAlpha.gen_decoder()
2828
end
2929

3030
def NonAlpha.encode_byte(block, table, tablelen)
31-
if (tablelen > 255) or (block == 0x7B)
31+
if tablelen > 255 || block == 0x7B
3232
raise RuntimeError, "BadChar"
3333
end
3434

35-
if (block >= 0x41 and block <= 0x5A) or (block >= 0x61 and block <= 0x7A)
35+
if (block >= 0x41 && block <= 0x5A) || (block >= 0x61 && block <= 0x7A)
3636
# gen offset, return magic
37-
offset = 0x7b - block;
37+
offset = 0x7b - block
3838
table += offset.chr
3939
tablelen = tablelen + 1
4040
block = 0x7B

spec/lib/rex/encoder/nonalpha_spec.rb

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# -*- coding:binary -*-
2+
require 'spec_helper'
3+
4+
require 'rex/encoder/nonalpha'
5+
6+
describe Rex::Encoder::NonAlpha do
7+
8+
let(:decoder) do
9+
dec = "\x66\xB9\xFF\xFF" +
10+
"\xEB\x19" +
11+
"\\\x5E" +
12+
"\x8B\xFE" +
13+
"\x83\xC7" + "." +
14+
"\x8B\xD7" +
15+
"\x3B\xF2" +
16+
"\\\x7D\x0B" +
17+
"\xB0\\\x7B" +
18+
"\xF2\xAE" +
19+
"\xFF\xCF" +
20+
"\xAC" +
21+
"\\\x28\x07" +
22+
"\xEB\xF1" +
23+
"\xEB" + "." +
24+
"\xE8\xE2\xFF\xFF\xFF"
25+
Regexp.new(dec)
26+
end
27+
28+
describe ".gen_decoder" do
29+
subject { described_class.gen_decoder }
30+
31+
it "returns an String" do
32+
is_expected.to be_kind_of(String)
33+
end
34+
35+
it "returns the decoder code" do
36+
is_expected.to match(decoder)
37+
end
38+
end
39+
40+
describe ".encode_byte" do
41+
subject { described_class.encode_byte(block, table, tablelen) }
42+
43+
context "when tablelen > 255" do
44+
let(:block) { 0x20 }
45+
let(:table) { "" }
46+
let(:tablelen) { 256 }
47+
48+
it "raises an error" do
49+
expect { subject }.to raise_error(RuntimeError)
50+
end
51+
end
52+
53+
context "when block == 0x7b" do
54+
let(:block) { 0x7b }
55+
let(:table) { "" }
56+
let(:tablelen) { 0 }
57+
58+
it "raises an error" do
59+
expect { subject }.to raise_error(RuntimeError)
60+
end
61+
end
62+
63+
context "when block is an upcase letter char code" do
64+
let(:block) { 0x42 }
65+
let(:table) { "" }
66+
let(:tablelen) { 0 }
67+
68+
it "returns an Array" do
69+
is_expected.to be_kind_of(Array)
70+
end
71+
72+
it "returns a 3 fields Array" do
73+
expect(subject.length).to eq(3)
74+
end
75+
76+
it "returns '{' char as block" do
77+
expect(subject[0]).to eq('{')
78+
end
79+
80+
it "appends offset to table" do
81+
expect(subject[1]).to eq((0x7b - block).chr)
82+
end
83+
84+
it "increments tablelen" do
85+
expect(subject[2]).to eq(tablelen + 1)
86+
end
87+
end
88+
89+
context "when block is a downcase letter char code" do
90+
let(:block) { 0x62 }
91+
let(:table) { "" }
92+
let(:tablelen) { 0 }
93+
94+
it "returns an Array" do
95+
is_expected.to be_kind_of(Array)
96+
end
97+
98+
it "returns a 3 fields Array" do
99+
expect(subject.length).to eq(3)
100+
end
101+
102+
it "returns '{' char as block" do
103+
expect(subject[0]).to eq('{')
104+
end
105+
106+
it "appends offset to table" do
107+
expect(subject[1]).to eq((0x7b - block).chr)
108+
end
109+
110+
it "increments tablelen" do
111+
expect(subject[2]).to eq(tablelen + 1)
112+
end
113+
end
114+
115+
context "when block is another char code" do
116+
let(:block) { 0x7c }
117+
let(:table) { "" }
118+
let(:tablelen) { 0 }
119+
120+
it "returns an Array" do
121+
is_expected.to be_kind_of(Array)
122+
end
123+
124+
it "returns a 3 fields Array" do
125+
expect(subject.length).to eq(3)
126+
end
127+
128+
it "returns same block char code" do
129+
expect(subject[0]).to eq(block.chr)
130+
end
131+
132+
it "doesn't modify table" do
133+
expect(subject[1]).to eq(table)
134+
end
135+
136+
it "doesn't modify tablelen" do
137+
expect(subject[2]).to eq(tablelen)
138+
end
139+
end
140+
end
141+
142+
end

0 commit comments

Comments
 (0)