ABUSO DE GADGET ICALL PARA COMUNICACIÓN
Así que estaba navegando por IDA y encontré esto
image
Tras una inspección más detallada podemos ver que llama a una función llamada _guard_dispatch_icall_ptr. El icall básicamente es un jmp a rax, así que si piensas un poco podemos modificar toda esta función para que en su lugar llame a nuestro handler usando shellcode.
Nuestro Shellcode
sub rsp,0x38
movabs rax,0xdeadbeef #placeholder for handler
movabs r10,0xab39cfee
inc rax
dec rax
call QWORD PTR [rip+0x720d4] # 0x720f8
jmp 0x29
Nuestro código
En cpp solo necesitamos obtener la dirección de la función y luego mapear nuestro shellcode en ella, pero aquí es donde se complica: si hacemos esto simplemente tal cual, corromperemos la pila y provocaremos un bluescreen de vez en cuando. Para evitar esto necesitaremos reparar la pila. Así que en lugar de retornar dentro de nuestro handler, deberíamos realizar las mismas operaciones que harían las funciones si no las hubiéramos modificado. Dejaré esto para que el lector lo haga por su cuenta porque no quiero darle en bandeja un método increíble de evasión de anticheats, pero recuerda mirar el asm original de la función y ver qué estamos modificando. NOTA APARTE: Si arreglas la corrupción de la pila y haces lo que la función pretendía hacer dentro de tu handler, ¡parecerá que nada ha sido modificado! :)
//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();
Conclusión
Espero que hayas sacado algo de este breve write up; solo ten en cuenta que también puedes encontrar otros gadgets que harán muchísimo más, cuanto más complejo mejor.