def create_memory_from_sections(cls, sections): o = microx.Operations() m = microx.Memory(o, 32) mem_map = None for section in sections: start = section['start'] size = section['size'] flags = section['flags'] name = section['name'] content = section['content'] #sys.stdout.write(f"[+] Processing section {name}\n") page_start = start & ~(0xFFF) page_end = (start + size + 0xFFF) & ~0xFFF if "[stack]" == name: sys.stdout.write( f"[+] Creating stack region from 0x{page_start:x} to 0x{page_end:x}. Flags: {flags}\n" ) mem_map = PolicyMemoryMap(o, page_start, page_end, flags, DefaultMemoryPolicy(), mapname=name) m.add_map(mem_map) else: for page in range(page_start, page_end, 0x1000): if not m.can_read(page): sys.stdout.write( f"[+] Mapping page from 0x{page:x} to 0x{page+0x1000:x}. Flags: {flags}\n" ) mem_map = PolicyMemoryMap(o, page, page + 0x1000, flags, DefaultMemoryPolicy(), mapname=name) m.add_map(mem_map) if content: assert mem_map is not None #sys.stdout.write(f"[+] Writing 0x{len(content):x} bytes at 0x{start:x}\n") mem_map.store_bytes_raw(start, content) return m
import traceback if __name__ == "__main__": # 13 Disassembly: # 14 0: 55 push ebp # 15 1: 89 e5 mov ebp,esp # 16 3: 51 push ecx # 17 4: 8b 45 08 mov eax,DWORD PTR [ebp+0x8] # 18 7: 8a 08 mov cl,BYTE PTR [eax] # 19 9: 88 4d ff mov BYTE PTR [ebp-0x1],cl # 20 c: 89 ec mov esp,ebp # 21 e: 5d pop ebp # 22 f: c2 00 00 ret 0x0 o = microx.Operations() code = microx.ArrayMemoryMap(o, 0x1000, 0x2000, can_write=False, can_execute=True) stack = microx.ArrayMemoryMap(o, 0x80000, 0x82000) code.store_bytes( 0x1000, b"\x55\x89\xE5\x51\x8B\x45\x08\x8A\x08\x88\x4D\xFF\x89\xEC\x5D\xC2\x00\x00" ) m = microx.Memory(o, 32) m.add_map(code)