1ère analyse
Sous Linux
- Vérifier les informations de base du fichier
$ file aaarg
aaarg: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f5b07c01242cc5987bed7730c2762ae0491b5ddc, stripped
- Donner les permissions d’exécution (si besoin)
$ chmod +x aaarg
Exécuter dans un environnement sécurisé
$ ./aaarg
L’exécution ne donne rien.
- Décompiler ou désassembler
$ objdump -d aaarg > aaarg.asm
Compliqué à lire 😊
2ème analyse
Utilisation de Ghidra.
On trouve une fonction d’entrée
void processEntry(undefined8 param_1, undefined8 param_2)
{
undefined auStack_8 [8];
__libc_start_main(FUN_00401190, param_2, &stack0x00000008, FUN_00401220, FUN_00401280, param_1, auStack_8);
do {
/* WARNING: Do nothing block with infinite loop */
} while(true);
}
- Appel à
__libc_start_main
La fonction __libc_start_main
est une fonction interne de la bibliothèque C standard qui est responsable de démarrer l’exécution d’un programme. Elle prépare l’environnement et appelle ensuite la fonction principale du programme, généralement main.
Utilisation de la fonction FUN_00401190
undefined8 FUN_00401190(int param_1, long param_2)
{
undefined8 uVar1;
ulong uVar2;
char *local_10;
uVar1 = 1;
if (1 < param_1) {
uVar2 = strtoul(*(char **)(param_2 + 8), &local_10, 10);
uVar1 = 1;
if ((*local_10 == '\0') && (uVar1 = 2, uVar2 == (long)-param_1)) {
uVar2 = 0;
do {
putc((int)(char)(&DAT_00402010)[uVar2], stdout);
uVar2 = uVar2 + 4;
} while (uVar2 < 0x116);
putc(10, stdout);
uVar1 = 0;
}
}
return uVar1;
}
FUN_00401190
: C’est une fonction qui semble être l’entrée de votre programme (probablement le début de main ou un équivalent).
Je vois qu’elle utilise des datas DAT_00402010
à l’adresse 0x00402010
.
DAT_00402010 XREF[2]:
FUN_00401140:00401150(R),
FUN_00401190:004011e0(R)
00402010 46 undefine 46h
00402011 e2 ?? E2h
00402012 80 ?? 80h
00402013 8d ?? 8Dh
Je ne sais plus trop quoi faire, j’utilise GDB pour mettre des points d’arrêts. De fil en aiguille, je n’arrive à rien (C’est la 1ère fois que je fais du reverse).
Et puis je décide de lire les données directement pour voir si ça me donne une idée
(gdb) x/16xb 0x00402010
0x00402010: 0x46 0xe2 0x80 0x8d 0x43 0xe2 0x80 0x8d
0x00402018: 0x53 0xe2 0x80 0x8d 0x43 0xe2 0x80 0x8d
Interprétation des valeurs hexadécimales :
0x46 correspond à la lettre 'F' en ASCII.
0x43 correspond à la lettre 'C' en ASCII.
0x53 correspond à la lettre 'S' en ASCII.
Ah FCS…, cela me dit quelque chose 😊
(gdb) x/512xb 0x00402010
0x402010: 0x46 0xe2 0x80 0x8d 0x43 0xe2 0x80 0x8d
0x402018: 0x53 0xe2 0x80 0x8d 0x43 0xe2 0x80 0x8d
0x402020: 0x7b 0xe2 0x80 0x8d 0x66 0xe2 0x80 0x8d
0x402028: 0x39 0xe2 0x80 0x8d 0x61 0xe2 0x80 0x8d
0x402030: 0x33 0xe2 0x80 0x8d 0x38 0xe2 0x80 0x8d
0x402038: 0x61 0xe2 0x80 0x8d 0x64 0xe2 0x80 0x8d
0x402040: 0x61 0xe2 0x80 0x8d 0x63 0xe2 0x80 0x8d
0x402048: 0x65 0xe2 0x80 0x8d 0x39 0xe2 0x80 0x8d
0x402050: 0x64 0xe2 0x80 0x8d 0x64 0xe2 0x80 0x8d
0x402058: 0x61 0xe2 0x80 0x8d 0x33 0xe2 0x80 0x8d
0x402060: 0x61 0xe2 0x80 0x8d 0x39 0xe2 0x80 0x8d
0x402068: 0x61 0xe2 0x80 0x8d 0x65 0xe2 0x80 0x8d
0x402070: 0x35 0xe2 0x80 0x8d 0x33 0xe2 0x80 0x8d
0x402078: 0x65 0xe2 0x80 0x8d 0x37 0xe2 0x80 0x8d
0x402080: 0x61 0xe2 0x80 0x8d 0x65 0xe2 0x80 0x8d
0x402088: 0x63 0xe2 0x80 0x8d 0x31 0xe2 0x80 0x8d
0x402090: 0x38 0xe2 0x80 0x8d 0x30 0xe2 0x80 0x8d
0x402098: 0x63 0xe2 0x80 0x8d 0x35 0xe2 0x80 0x8d
0x4020a0: 0x61 0xe2 0x80 0x8d 0x37 0xe2 0x80 0x8d
0x4020a8: 0x33 0xe2 0x80 0x8d 0x64 0xe2 0x80 0x8d
0x4020b0: 0x62 0xe2 0x80 0x8d 0x62 0xe2 0x80 0x8d
0x4020b8: 0x37 0xe2 0x80 0x8d 0x63 0xe2 0x80 0x8d
0x4020c0: 0x33 0xe2 0x80 0x8d 0x36 0xe2 0x80 0x8d
0x4020c8: 0x34 0xe2 0x80 0x8d 0x66 0xe2 0x80 0x8d
0x4020d0: 0x65 0xe2 0x80 0x8d 0x31 0xe2 0x80 0x8d
0x4020d8: 0x33 0xe2 0x80 0x8d 0x37 0xe2 0x80 0x8d
0x4020e0: 0x66 0xe2 0x80 0x8d 0x63 0xe2 0x80 0x8d
0x4020e8: 0x36 0xe2 0x80 0x8d 0x37 0xe2 0x80 0x8d
0x4020f0: 0x32 0xe2 0x80 0x8d 0x31 0xe2 0x80 0x8d
0x4020f8: 0x64 0xe2 0x80 0x8d 0x37 0xe2 0x80 0x8d
0x402100: 0x39 0xe2 0x80 0x8d 0x39 0xe2 0x80 0x8d
0x402108: 0x37 0xe2 0x80 0x8d 0x63 0xe2 0x80 0x8d
0x402110: 0x35 0xe2 0x80 0x8d 0x34 0xe2 0x80 0x8d
0x402118: 0x65 0xe2 0x80 0x8d 0x38 0xe2 0x80 0x8d
0x402120: 0x64 0xe2 0x80 0x8d 0x7d 0x00 0x00 0x00
0x402128: 0x01 0x1b 0x03 0x3b 0x44 0x00 0x00 0x00
0x402130: 0x07 0x00 0x00 0x00 0xf8 0xee 0xff 0xff
0x402138: 0xa0 0x00 0x00 0x00 0x28 0xef 0xff 0xff
0x402140: 0x60 0x00 0x00 0x00 0x58 0xef 0xff 0xff
0x402148: 0x8c 0x00 0x00 0x00 0x18 0xf0 0xff 0xff
0x402150: 0xc8 0x00 0x00 0x00 0x68 0xf0 0xff 0xff
0x402158: 0xe4 0x00 0x00 0x00 0xf8 0xf0 0xff 0xff
0x402160: 0x08 0x01 0x00 0x00 0x58 0xf1 0xff 0xff
0x402168: 0x50 0x01 0x00 0x00 0x00 0x00 0x00 0x00
0x402170: 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x402178: 0x01 0x7a 0x52 0x00 0x01 0x78 0x10 0x01
0x402180: 0x1b 0x0c 0x07 0x08 0x90 0x01 0x07 0x10
0x402188: 0x10 0x00 0x00 0x00 0x1c 0x00 0x00 0x00
0x402190: 0xc0 0xee 0xff 0xff 0x2b 0x00 0x00 0x00
0x402198: 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x00
0x4021a0: 0x00 0x00 0x00 0x00 0x01 0x7a 0x52 0x00
0x4021a8: 0x01 0x78 0x10 0x01 0x1b 0x0c 0x07 0x08
0x4021b0: 0x90 0x01 0x00 0x00 0x10 0x00 0x00 0x00
0x4021b8: 0x1c 0x00 0x00 0x00 0xc4 0xee 0xff 0xff
0x4021c0: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x4021c8: 0x24 0x00 0x00 0x00 0x30 0x00 0x00 0x00
0x4021d0: 0x50 0xee 0xff 0xff 0x30 0x00 0x00 0x00
0x4021d8: 0x00 0x0e 0x10 0x46 0x0e 0x18 0x4a 0x0f
0x4021e0: 0x0b 0x77 0x08 0x80 0x00 0x3f 0x1a 0x3b
0x4021e8: 0x2a 0x33 0x24 0x22 0x00 0x00 0x00 0x00
0x4021f0: 0x18 0x00 0x00 0x00 0x58 0x00 0x00 0x00
0x4021f8: 0x48 0xef 0xff 0xff 0x42 0x00 0x00 0x00
0x402200: 0x00 0x41 0x0e 0x10 0x83 0x02 0x7c 0x0e
0x402208: 0x08 0x00 0x00 0x00 0x20 0x00 0x00 0x00
Petit programme python pour déchiffrer 😊
# Données brutes extraites
hex_data = [
0x46, 0xe2, 0x80, 0x8d, 0x43, 0xe2, 0x80, 0x8d, 0x53, 0xe2, 0x80, 0x8d,
0x43, 0xe2, 0x80, 0x8d, 0x7b, 0xe2, 0x80, 0x8d, 0x66, 0xe2, 0x80, 0x8d,
0x39, 0xe2, 0x80, 0x8d, 0x61, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d,
0x38, 0xe2, 0x80, 0x8d, 0x61, 0xe2, 0x80, 0x8d, 0x64, 0xe2, 0x80, 0x8d,
0x61, 0xe2, 0x80, 0x8d, 0x63, 0xe2, 0x80, 0x8d, 0x65, 0xe2, 0x80, 0x8d,
0x39, 0xe2, 0x80, 0x8d, 0x64, 0xe2, 0x80, 0x8d, 0x64, 0xe2, 0x80, 0x8d,
0x61, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d, 0x61, 0xe2, 0x80, 0x8d,
0x39, 0xe2, 0x80, 0x8d, 0x61, 0xe2, 0x80, 0x8d, 0x65, 0xe2, 0x80, 0x8d,
0x35, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d, 0x65, 0xe2, 0x80, 0x8d,
0x37, 0xe2, 0x80, 0x8d, 0x61, 0xe2, 0x80, 0x8d, 0x65, 0xe2, 0x80, 0x8d,
0x63, 0xe2, 0x80, 0x8d, 0x31, 0xe2, 0x80, 0x8d, 0x38, 0xe2, 0x80, 0x8d,
0x30, 0xe2, 0x80, 0x8d, 0x63, 0xe2, 0x80, 0x8d, 0x35, 0xe2, 0x80, 0x8d,
0x61, 0xe2, 0x80, 0x8d, 0x37, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d,
0x64, 0xe2, 0x80, 0x8d, 0x62, 0xe2, 0x80, 0x8d, 0x62, 0xe2, 0x80, 0x8d,
0x37, 0xe2, 0x80, 0x8d, 0x63, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d,
0x36, 0xe2, 0x80, 0x8d, 0x34, 0xe2, 0x80, 0x8d, 0x66, 0xe2, 0x80, 0x8d,
0x65, 0xe2, 0x80, 0x8d, 0x31, 0xe2, 0x80, 0x8d, 0x33, 0xe2, 0x80, 0x8d,
0x37, 0xe2, 0x80, 0x8d, 0x66, 0xe2, 0x80, 0x8d, 0x63, 0xe2, 0x80, 0x8d,
0x36, 0xe2, 0x80, 0x8d, 0x37, 0xe2, 0x80, 0x8d, 0x32, 0xe2, 0x80, 0x8d,
0x31, 0xe2, 0x80, 0x8d, 0x64, 0xe2, 0x80, 0x8d, 0x37, 0xe2, 0x80, 0x8d,
0x39, 0xe2, 0x80, 0x8d, 0x39, 0xe2, 0x80, 0x8d, 0x37, 0xe2, 0x80, 0x8d,
0x63, 0xe2, 0x80, 0x8d, 0x35, 0xe2, 0x80, 0x8d, 0x34, 0xe2, 0x80, 0x8d,
0x65, 0xe2, 0x80, 0x8d, 0x38, 0xe2, 0x80, 0x8d, 0x64, 0xe2, 0x80, 0x8d,
0x7d, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x03, 0x3b, 0x44, 0x00, 0x00, 0x00
]
# Convertir les bytes en texte en éliminant les ZWJ (Zero Width Joiner)
decoded_chars = []
for byte in hex_data:
if byte >= 0x20 and byte <= 0x7e: # Si le byte est un caractère visible
decoded_chars.append(chr(byte))
decoded_text = ''.join(decoded_chars)
print(decoded_text)
Sortie :
FCSC{f9a38adace9dda3a9ae53e7aec180c5a73dbb7c364fe137fc6721d7997c54e8d};D