ABUSO DI ICALL GADGET PER LA COMUNICAZIONE
Quindi stavo scorrendo in IDA e ho trovato questo
image
Dopo ulteriori ispezioni possiamo vedere che chiama una funzione chiamata _guard_dispatch_icall_ptr. L'icall in pratica è un jmp a rax quindi se ragionate un po' possiamo modificare l'intera funzione per chiamare invece il nostro handler usando lo shellcode.
Il nostro Shellcode
Creeremo uno shellcode che imposta rax a un ptr alla nostra funzione handler. In questo modo quando la funzione viene chiamata eseguirà il nostro shellcode e chiamerà il nostro handler. Vogliamo assicurarci che quando creiamo il nostro shellcode sia esattamente della stessa dimensione in byte del codice che stiamo modificando. Quindi ecco un esempio dello shellcode che ho usato in asm, dovrete convertirlo in byte.
sub rsp,0x38
movabs rax,0xdeadbeef #placeholder for handler
movabs r10,0xab39cfee
inc rax
dec rax
call QWORD PTR [rip+0x720d4] # 0x720f8
jmp 0x29
Il nostro codice
In cpp dobbiamo semplicemente ottenere l'indirizzo della funzione e poi mappare il nostro shellcode al suo interno, ma qui è dove diventa complicato: se lo facciamo semplicemente così com'è corromperemo lo stack e andremo in bluescreen di tanto in tanto. Per evitarlo dovremo riparare lo stack. Quindi invece di ritornare all'interno del nostro handler dovremmo eseguire le stesse operazioni che le funzioni farebbero se non l'avessimo modificata. Lascio questo al lettore da fare per conto proprio perché non voglio dare la pappa pronta su un metodo fantastico di evasione dagli anticheat, ma ricordate di guardare l'asm originale della funzione e vedere cosa stiamo modificando. NOTA A MARGINE: se sistemate la corruzione dello stack e fate ciò che la funzione intendeva fare all'interno del vostro handler apparirà come se nulla fosse stato modificato! :)
//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();
Conclusione
Spero che abbiate tratto qualcosa da questa rapida guida, sappiate solo che potete trovare anche altri gadget che faranno molto di più, più sono complessi meglio è.