
Jeux de données de référence et artefacts de synthèse pour QSynth, contenant des fonctions C obfusquées par Tigress, des binaires x86_64, des traces d'exécution, la vérité terrain et des résultats d'AST synthétisés.
Ces artefacts fournissent les quatre datasets suivants :
Chaque répertoire de dataset contient les fichiers suivants :
original.c : fichier source contenant toutes les fonctions
obfuscated.c : fichier source obfusqué tel que généré par Tigress
run_tigress.sh : script Shell pour régénérer le fichier obfuscated.c
ground_truth.json : un fichier JSON contenant la ground truth. Pour chaque fonction, il contient l'expression originale (dans original.c) et son équivalent obfusqué dans (obfuscated.c)
obfuscated : binaire précompilé en x86_64 (no PIE)
trace.db : la trace d'exécution sous forme de base de données SQLite (probablement le fichier le plus intéressant)
results :
Le fichier qsynth.json contient pour chaque fonction les entrées suivantes, telles que :
{
"target_1": {
"fun_name": "target_1",
"start": 164,
"stop": 238,
"orig_ast": "~(b*d ^ d*d) - b",
"orig_node": 10,
"orig_depth": 5,
"obfu_ast": "(((b & d)*(b | d) + (b & ~d)*(~b & d) & (d & d)*(d | d) + (d & ~d)*(~d & d)) - ((b & d)*(b | d) + (b & ~d)*(~b & d) | (d & d)*(d | d) + (d & ~d)*(~d & d)) - 1 ^ b) - ((~(((b & d)*(b | d) + (b & ~d)*(~b & d) & (d & d)*(d | d) + (d & ~d)*(~d & d)) - ((b & d)*(b | d) + (b & ~d)*(~b & d) | (d & d)*(d | d) + (d & ~d)*(~d & d)) - 1) & b) + (~(((b & d)*(b | d) + (b & ~d)*(~b & d) & (d & d)*(d | d) + (d & ~d)*(~d & d)) - ((b & d)*(b | d) + (b & ~d)*(~b & d) | (d & d)*(d | d) + (d & ~d)*(~d & d)) - 1) & b))",
"obfu_node": 229,
"obfu_depth": 12,
"triton_ast": "(((b & d)*(b | d) + (~b & d)*(~d & b) & d*d) - (d*d | (b & d)*(b | d) + (~b & d)*(~d & b)) - 1 ^ b) - (((d*d ^ (b & d)*(b | d) + (~b & d)*(~d & b)) & b) + ((d*d ^ (b & d)*(b | d) + (~b & d)*(~d & b)) & b))",
"triton_node": 95,
"triton_depth": 10,
"synthesized_ast": "~((d*d ^ d*b) + b)",
"synth_node": 10,
"synth_depth": 5,
"dse_t": 0.10445356369018555,
"synthesis_t": 0.03491616249084473,
"sem_orig_obf": "UNK",
"sem_obf_trit": "UNK",
"sem_orig_synth": "OK",
"is_simplified": true,
"is_fully_synthesized": true
}
}
Start et stop sont les offsets dans la trace d'exécution (donc l'id dans la DB). Ensuite, pour chaque
expression, l'expression elle-même ainsi que sa taille en nœuds et sa profondeur. Puis dse_t, synthesis_t donnent
respectivement le temps d'exécution symbolique et le temps de synthèse. is_simplified et is_fully_synthesized
indiquent si la fonction a été simplifiée et, le cas échéant, si elle l'a été entièrement. sem_orig_obf, sem_obf_trit
et sem_orig_synth indiquent si la sémantique est préservée entre, par exemple, l'original et le synthétisé
(sem_orig_synth). "UNK" indique que cela n'a pas été vérifié ou que cela a abouti à un timeout.
Les tables utilisées pour les benchmarks sont disponibles ici : https://ret2libc.com/static/various/lts_15/ Ce sont des objets pickle Python. Les expressions sont encodées avec une notation polonaise inversée (RPN) similaire à celle de Syntia.