Practical Malware Analysis - Lab 19
In these labs, we’ll use what we’ve covered in Chapter 19 to analyze samples inspired by real shellcode. Because a debugger cannot easily load and run shellcode directly, we’ll use a utility called shellcode_launcher.exe to dynamically analyze shellcode binaries. You’ll find instructions on how to use this utility in Chapter 19 and in the detailed analyses in Appendix C.
Lab 19-1
Analyze the file Lab19-01.bin using shellcode_launcher.exe.
Q1: How is the shellcode encoded?
Opening in HxD, we can see the NOP sled 41 (opcode for inc ecx) which are used typically in bufferoverflows
After that ,we got 0x18Dh(397 in decimal) in ecx then jmp 21F
Which first calls loc_208 (which is the decoding routine), the decoding routine puts the next EIP points to after the call to esi then to edi(safe copy puts that again in the stack) and to al(via lodsb) and to dl dl = [SI]- 41 shl dl, 4 al = (([ESI] ) - 41)+ dl =
then store EAX to [EDI]
Running
shellcode_launcher.exe -i Lab19-01.bin -bp
Then setting x32dbg as JIT
here is a code to decode it
def sub_208(data):
esi = len(data) - 1
stack = []
edi = esi
while esi >= 0:
al = data[esi]
esi -= 1
dl = al - ord('A')
dl = dl << 4
al = data[esi]
esi -= 1
al = al - ord('A') + dl
stack.append(al)
edi -= 1
return bytes(stack)
input_data = bytearray.fromhex('494A4F4649424F4D45414141414141414F4A444441424141414146474648494C48454345414D44425050504D44424D414B4D44494F414845414B4D424D50414E41424D484F4A4F50505050505049504A50494650464F4D43414541414741494C474D4345434543494C4546444D494C46454146484941424F4B494C454B4249494C464B434141424F4C4F44434B454A494C4445494C41424F4F46474F494C4C50505050445050444C45454345434948464F4D494C464B434541424F4C4747494C414D454C494C464B424D41424F4C494C4145494C41424F494F4A414341414141414142424D41494A45454345424D47424D4341494141464744424D414745494C4541444149464D4148494150494C4541414D494C4841424D4B4E494C454141494F4A414641414141414F4A504C505050504650464F4D44464C4F494E4A5050505049504A4D43474949454F414F4F4D46434F494949415050504950494A4546504D47494D42484A4F464C4946434F4948435050505049444C45454345434948464F4D494C464B434541424F4C4747494C414D454C494C464B424D41424F4C494C4145494C41424F494F4A414341414141414142424D41494A45454345424D47424D4341494141464744424D414745494C4541444149464D4148494150494C4541414D494C4841424D4B4E494C454141494F4A414641414141414F4A504C505050504650464F4D44464C4F494E4A5050505049504A4D43474949454F414F4F4D46434F494949415050504950494A4546504D47494D42484A4F464C4946434F4948435050505049444C45454345434948464F4D494C464B434541424F4C4747494C414D454C494C464B424D41424F4C494C4145494C41424F494F4A414341414141414142424D41494A45454345424D47424D4341494141464744424D41474549')
output_data = sub_208(input_data)
print(output_data.hex().upper())
Q2: Which functions does the shellcode manually import?
Running this command:
scdbg -f Lab19-01.bin -findsc
Q3: What network host does the shellcode communicate with?
Q4: What filesystem residue does the shellcode leave?
Q5: What does the shellcode do?
Lab 19-1
The file Lab19-02.exe contains a piece of shellcode that will be injected into another process and run. Analyze this file.
Q1: What process is injected with the shellcode?
Analysis of exe in ida, first it starts with excalating privilege
then, it pushes argument Data to call 401000 which is used later , so that call puts something in Data
401000 opens registery “HKEY_CLASSES_ROOTHTTPshellopencommand”. This registry key configures your systems default browser, and the program specified
queries the value there and puts it into Data
then calls 401180 with that Data (which contains the default browser) and another parameter processID which is used later
in 401180 it create process with the Data and put the PID to processID
then calls 401230(likely the injector) with the PID and an offset (which is likely the shellcode)
401230 it process injects the default browser with lpBaseAddress which the offset given
going to the offset we see undefined data
pressing c, we see the unpacker which gets address starting from 407048 (with call then pop) then loops over this data XORing it with 0xE7 for range 0x18F
xor Then saving to file and open it in scdbg(failed have to be dynamic analysis)
opening in x32dbg and set bp and writeprocessmemory to dump the injected shellcode we see our shellcode at 407030 at edx
following in dump
we get the imports
Q2: Where is the shellcode located?
Q3: How is the shellcode encoded?
Q4: Which functions does the shellcode manually import?
Q5: What network hosts does the shellcode communicate with?
Q6: What does the shellcode do?