LINUX.ORG.RU

История изменений

Исправление uwuwuu, (текущая версия) :

так различия только в том, что с os.system, тебе не нужен вывод, а только код.

А под капотом там, наверное, магия, сводящееся к записи куда-то в память, те работе с файлами. Как в этом случае с вызовом asm:

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()

хотя я тупллю… там в исходниках просто сишный system

Исходная версия uwuwuu, :

так различия только в том, что с os.system, тебе не нужен вывод, а только код.

А под капотом там, наверное, магия, сводящееся к записи куда-то в память, те работе с файлами. Как в этом случае с вызовом asm:

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()