Skip to content

Commit 3b1042b

Browse files
committed
Add specs for Rex::OLE::DirEntry#from_s
1 parent ac5996f commit 3b1042b

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

spec/lib/rex/ole/direntry_spec.rb

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,145 @@
186186
end
187187
end
188188

189+
describe "#from_s" do
190+
let(:valid_direntry) do
191+
"\x52\x00\x6f\x00\x6f\x00\x74\x00\x20\x00\x45\x00\x6e\x00\x74\x00\x72\x00\x79\x00\x00\x00" + # name (_ab)
192+
("\x00" * 42) + # padding
193+
"\x16\x00" + # _cb
194+
"\x05" + # _mse
195+
"\x00" + #_bflags
196+
"\xff\xff\xff\xff" + # _sidLeftSib
197+
"\xff\xff\xff\xff" + # _sidRightSib
198+
"\xff\xff\xff\xff" + # _sidChild
199+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + # clsid
200+
"\x00\x00\x00\x00" + # _dwUserFlags
201+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _ctime
202+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _metime
203+
"\xfe\xff\xff\xff" + # _sectStart
204+
"\x00\x00\x00\x00\x00\x00\x00\x00" # _ulSize
205+
end
206+
207+
let(:invalid_name_length)do
208+
"\x52\x00\x6f\x00\x6f\x00\x74\x00\x20\x00\x45\x00\x6e\x00\x74\x00\x72\x00\x79\x00\x00\x00" + # name (_ab)
209+
("\x00" * 42) + # padding
210+
"\x41\x00" + # _cb (invalid, major than 0x40)
211+
"\x05" + # _mse
212+
"\x00" + #_bflags
213+
"\xff\xff\xff\xff" + # _sidLeftSib
214+
"\xff\xff\xff\xff" + # _sidRightSib
215+
"\xff\xff\xff\xff" + # _sidChild
216+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + # clsid
217+
"\x00\x00\x00\x00" + # _dwUserFlags
218+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _ctime
219+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _metime
220+
"\xfe\xff\xff\xff" + # _sectStart
221+
"\x00\x00\x00\x00\x00\x00\x00\x00" # _ulSize
222+
end
223+
224+
let(:mismatch_length) do
225+
"\x52\x00\x6f\x00\x6f\x00\x74\x00\x20\x00\x45\x00\x6e\x00\x74\x00\x72\x00\x79\x00\x00\x00" + # name (_ab)
226+
("\x00" * 42) + # padding
227+
"\x13\x00" + # _cb (invalid length, shorter than real name length)
228+
"\x05" + # _mse
229+
"\x00" + #_bflags
230+
"\xff\xff\xff\xff" + # _sidLeftSib
231+
"\xff\xff\xff\xff" + # _sidRightSib
232+
"\xff\xff\xff\xff" + # _sidChild
233+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + # clsid
234+
"\x00\x00\x00\x00" + # _dwUserFlags
235+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _ctime
236+
"\x00\x00\x00\x00\x00\x00\x00\x00" + # _metime
237+
"\xfe\xff\xff\xff" + # _sectStart
238+
"\x00\x00\x00\x00\x00\x00\x00\x00" # _ulSize
239+
end
240+
241+
let(:sid) { 0 }
242+
243+
context "when name length major than 64" do
244+
it "raises RuntimeError" do
245+
expect { dir_entry.from_s(sid, invalid_name_length) }.to raise_error(RuntimeError)
246+
end
247+
end
248+
249+
context "when name length doesn't match real length" do
250+
it "raises RuntimeError" do
251+
expect { dir_entry.from_s(sid, mismatch_length) }.to raise_error(RuntimeError)
252+
end
253+
end
254+
255+
context "when valid buf" do
256+
it "uses argument sid" do
257+
dir_entry.from_s(sid, valid_direntry)
258+
expect(dir_entry.sid).to eq(sid)
259+
end
260+
261+
it "parses _ab from buf" do
262+
dir_entry.from_s(sid, valid_direntry)
263+
expect(dir_entry.instance_variable_get(:@_ab)).to eq('Root Entry')
264+
end
265+
266+
it "parses _cb from buf" do
267+
dir_entry.from_s(sid, valid_direntry)
268+
expect(dir_entry.instance_variable_get(:@_cb)).to eq(22)
269+
end
270+
271+
it "parses _mse from buf" do
272+
dir_entry.from_s(sid, valid_direntry)
273+
expect(dir_entry.instance_variable_get(:@_mse)).to eq(Rex::OLE::STGTY_ROOT)
274+
end
275+
276+
it "parses _bflags from buf" do
277+
dir_entry.from_s(sid, valid_direntry)
278+
expect(dir_entry.instance_variable_get(:@_bflags)).to eq(0)
279+
end
280+
281+
it "parses _sidLeftSib from buf" do
282+
dir_entry.from_s(sid, valid_direntry)
283+
expect(dir_entry._sidLeftSib).to eq(Rex::OLE::SECT_FREE)
284+
end
285+
286+
it "parses _sidRightSib from buf" do
287+
dir_entry.from_s(sid, valid_direntry)
288+
expect(dir_entry._sidRightSib).to eq(Rex::OLE::SECT_FREE)
289+
end
290+
291+
it "parses _sidChild from buf" do
292+
dir_entry.from_s(sid, valid_direntry)
293+
expect(dir_entry._sidChild).to eq(Rex::OLE::SECT_FREE)
294+
end
295+
296+
it "parses _clsId from buf" do
297+
dir_entry.from_s(sid, valid_direntry)
298+
expect(dir_entry.instance_variable_get(:@_clsId)).to be_a(Rex::OLE::CLSID)
299+
end
300+
301+
it "parses _dwUserFlags from buf" do
302+
dir_entry.from_s(sid, valid_direntry)
303+
expect(dir_entry.instance_variable_get(:@_dwUserFlags)).to eq(0)
304+
end
305+
306+
it "parses _ctime from buf" do
307+
dir_entry.from_s(sid, valid_direntry)
308+
expect(dir_entry.instance_variable_get(:@_ctime)).to eq("\x00" * 8)
309+
end
310+
311+
it "parses _mtime from buf" do
312+
dir_entry.from_s(sid, valid_direntry)
313+
expect(dir_entry.instance_variable_get(:@_mtime)).to eq("\x00" * 8)
314+
end
315+
316+
it "parses _sectStart from buf" do
317+
dir_entry.from_s(sid, valid_direntry)
318+
expect(dir_entry.instance_variable_get(:@_sectStart)).to eq(Rex::OLE::SECT_END)
319+
end
320+
321+
it "parses _ulSize from buf" do
322+
dir_entry.from_s(sid, valid_direntry)
323+
expect(dir_entry.instance_variable_get(:@_ulSize)).to eq(0)
324+
end
325+
end
326+
end
327+
189328
describe "#pack" do
190329
it "returns an string" do
191330
expect(dir_entry.pack).to be_an(String)

0 commit comments

Comments
 (0)