From b74d7a9e7e22f623d114d59f6c0282ef8844eb9c Mon Sep 17 00:00:00 2001 From: Clement Rouault Date: Thu, 7 Jul 2016 13:16:36 +0200 Subject: [PATCH] Add Jmp/Call Far 16:32 in simple_x86 + clean and simplify syswow-to-64 execution --- windows/native_exec/simple_x86.py | 34 ++++++++++- windows/syswow64.py | 94 ++++++++++++------------------- 2 files changed, 68 insertions(+), 60 deletions(-) diff --git a/windows/native_exec/simple_x86.py b/windows/native_exec/simple_x86.py index 1060c57..235f4a3 100644 --- a/windows/native_exec/simple_x86.py +++ b/windows/native_exec/simple_x86.py @@ -275,6 +275,12 @@ def accept_as_16immediat(x): raise ImmediatOverflow("16bits signed Immediat overflow") +def accept_as_unsigned_16immediat(x): + try: + return struct.pack(" ret | 8 -> ljump - size_to_alloc = len(shellcode) + len(genere_return_32bits_stub(0xffffffff)) + 1 + 8 - addr = windows.current_process.allocator.reserve_size(size_to_alloc) - # post-exec 32bits stub (xor eax, eax; ret) - ret = "\xC3" - ret_addr = addr - shell_code_addr = ret_addr + len(ret) + len(dummy_jump) - # ljmp - jump = "\xea" + struct.pack("".format(i, type(value).__name__)) writable_args.append(value) - # Build buffer buffer = struct.pack("<" + "Q" * len(writable_args), *writable_args) ctypes.memmove(argument_buffer, buffer, len(buffer)) - # TODO : get 64bits returned value ? return native_caller() wrapper.__name__ = "{0}".format(target.__name__,) wrapper.__doc__ = "This is a wrapper to {0} in 64b mode, it accept <{1}> args".format(target.__name__, expected_arguments_number) @@ -173,8 +151,8 @@ def try_generate_stub_target(shellcode, argument_buffer, target): def get_current_process_syswow_peb_addr(): - get_peb_64_code = x64.Mov('RAX', x64.mem('gs:[0x60]')) - return execute_64bits_code_from_syswow(get_peb_64_code.get_code()) + get_peb_64_code = x64.assemble("mov rax, gs:[0x60]; ret") + return execute_64bits_code_from_syswow(get_peb_64_code) def get_current_process_syswow_peb(): current_process = windows.current_process