ABUS DES GADGETS ICALL POUR LA COMMUNICATION
Donc je parcourais IDA et j'ai trouvé ceci
image
Après une inspection plus approfondie, nous pouvons voir qu'il appelle une fonction nommée _guard_dispatch_icall_ptr. L'icall est essentiellement un jmp vers rax, donc si vous réfléchissez un peu, nous pouvons modifier toute cette fonction pour appeler notre handler à la place en utilisant du shellcode.
Notre Shellcode
Nous allons créer un shellcode qui place dans rax un pointeur vers notre fonction handler. Ainsi, lorsque la fonction est appelée, elle exécutera notre shellcode et appellera notre handler. Nous devons nous assurer que lorsque nous créons notre shellcode, il fait exactement la même taille en octets que le code que nous modifions. Voici donc un exemple du shellcode que j'ai utilisé en asm ; vous devrez le convertir en octets.
sub rsp,0x38
movabs rax,0xdeadbeef #placeholder for handler
movabs r10,0xab39cfee
inc rax
dec rax
call QWORD PTR [rip+0x720d4] # 0x720f8
jmp 0x29
Notre code
En cpp, nous devons simplement obtenir l'adresse de la fonction puis y mapper notre shellcode, mais c'est là que ça devient délicat : si nous faisons cela simplement tel quel, nous corromprons la pile et obtiendrons un écran bleu de temps en temps. Pour éviter cela, nous devrons réparer la pile. Donc au lieu de retourner à l'intérieur de notre handler, nous devrions effectuer les mêmes opérations que la fonction ferait si nous ne l'avions pas modifiée. Je laisse cela au lecteur car je ne veux pas donner tout cuit une méthode incroyable d'évasion des anticheats, mais rappelez-vous de regarder l'asm original de la fonction et de voir ce que nous modifions. NOTE ANNEXE : Si vous corrigez la corruption de pile et faites ce que la fonction était censée faire à l'intérieur de votre handler, il apparaîtra que rien n'a été modifié ! :)
//getting address to function
FunctionAddress = module + 0xD70C;
BYTE shellcode[] = { 0x48, 0x83, 0xEC, 0x38, 0x48, 0xB8, 0xEF, 0xBE, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBA, 0xEE, 0xCF, 0x39, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xC0, 0x48, 0xFF, 0xC8, 0xFF, 0x15, 0xD4, 0x20, 0x07, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00 };
memcpy(&shellcode[6], &hkfunction, 8);
DisableWriteProtection();
memcpy((PVOID)FunctionAddress, &shellcode, sizeof(shellcode));
EnableWriteProtection();
Conclusion
J'espère que vous avez tiré quelque chose de ce petit write-up ; sachez simplement que vous pouvez aussi trouver d'autres gadgets qui feront bien plus, et plus c'est complexe, mieux c'est.