load-model-nul-byte-abort / trigger_load_model_abort.py
testamentaria's picture
Upload 5 files
05bfdef verified
Raw
History Blame Contribute Delete
1.47 kB
"""
Llama a load_model() de la libc_wrapper.dll recien compilada sobre el fichero .surml
malicioso (malicious_nul_name.surml, generado por craft_malicious_surml.py) para confirmar
si el proceso aborta (Candidato 1 de focus-02-c-wrapper-ffi.md) en vez de devolver un
FileInfo con is_error=1.
Se ejecuta como proceso HIJO separado (ver run_trigger.py) precisamente porque si el bug es
real, este proceso Python entero morira sin excepcion capturable.
"""
import ctypes
from ctypes import Structure, c_char_p, c_int
import os
DLL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "repo", "target", "release", "c_wrapper.dll"))
class FileInfo(Structure):
_fields_ = [
("file_id", c_char_p),
("name", c_char_p),
("description", c_char_p),
("version", c_char_p),
("error_message", c_char_p),
("is_error", c_int),
]
lib = ctypes.CDLL(DLL_PATH)
lib.load_model.argtypes = [c_char_p]
lib.load_model.restype = FileInfo
print("Antes de load_model() -- si el proceso muere aqui sin imprimir la linea de abajo, "
"confirma el abort no capturable.")
outcome = lib.load_model(os.path.abspath("malicious_nul_name.surml").encode("utf-8"))
print("DESPUES de load_model() -- NO abortó.")
print(f"is_error={outcome.is_error}")
if outcome.is_error:
print(f"error_message={outcome.error_message.decode('utf-8', errors='replace')}")
else:
print(f"file_id={outcome.file_id}, name={outcome.name}")