Première analyse
Le binaire .NET fourni refuse de s’ouvrir proprement dans dnSpy : les noms de classes et méthodes sont remplacés par des caractères Unicode illisibles, et le point d’entrée semble exécuter un stub de déchiffrement avant de charger le vrai code.
Identification du packer
En observant le comportement avec Process Monitor, on constate que l’exécutable écrit un assembly temporaire en mémoire puis l’exécute via Assembly.Load(). C’est un pattern classique de packer .NET maison.
Unpacking
On place un breakpoint sur Assembly.Load() dans dnSpy. Quand le breakpoint est touché, l’argument contient l’assembly déchiffré en clair. On le sauvegarde sur disque.
// Point de breakpoint stratégique
// System.Reflection.Assembly.Load(byte[] rawAssembly)
// → Sauvegarder rawAssembly quand le BP est touché
Analyse du code dépacké
L’assembly dépacké révèle une logique simple : le flag est XORé avec une clé hardcodée, puis encodé en base64. En inversant l’opération, on obtient le flag.
Flag : flag{d0tn3t_unp4ck_dnspy_m4st3r}