I want to execute assembly code inside a python script. Is that possible?
In C programming would be like this
static inline getesp(){
__asm__(\"m
As a specific example, here is how to call a function which will take an int and return it incremented by one.
To obtain memory with the executable flag set, mmap
module is used.
To call the function, ctypes
module is used.
To put the machine code into memory, there is hardcoded byte string of x86-64 machine code.
The code will print 43.
In practice, I'd write the code in C shared object library and use inline assembly in C. I'd then use cffi
to load and run the library. The advantage of this example is that it is self-contained and only needs the standard Python library.
import ctypes
import mmap
buf = mmap.mmap(-1, mmap.PAGESIZE, prot=mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC)
ftype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
fpointer = ctypes.c_void_p.from_buffer(buf)
f = ftype(ctypes.addressof(fpointer))
buf.write(
b'\x8b\xc7' # mov eax, edi
b'\x83\xc0\x01' # add eax, 1
b'\xc3' # ret
)
r = f(42)
print(r)
del fpointer
buf.close()