File size: 1,469 Bytes
05bfdef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""
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}")