
Un PICO per Crystal Palace che implementa l'hosting di CLR per eseguire un assembly .NET in memoria.
Un PICO per Crystal Palace che implementa l'hosting nativo del CLR per eseguire un assembly .NET aggiunto in memoria, usando la stessa tecnica del generatore di shellcode donut. Questo ti permette di caricare strumenti .NET come Rubeus o Seatbelt da codice indipendente dalla posizione senza scriverli su disco.

Servono MinGW GCC, l'utility zip e gli eseguibili CPL necessari per linkare il progetto. Modifica config.spec per specificare l'assembly .NET da linkare al progetto e gli argomenti della riga di comando da passare. Modifica Makefile per indicare la posizione di crystalpalace.jar.
Per compilare il solo PICO (come COFF), esegui make pico. Per compilare il runner di esempio e linkarlo con il PICO, esegui make runner.
Il runner di esempio viene scritto in out/runner.bin. La configurazione predefinita richiama un assembly Rubeus aggiunto per eseguire "asktgt" con alcune credenziali fittizie generiche quando lo esegui:

La firma dell'entrypoint del PICO è:
HRESULT (*EXECUTE_ASSEMBLY_PICO)(char *assembly, size_t assembly_len, WCHAR *argv[], int argc);
I primi due argomenti devono contenere un puntatore a un assembly .NET grezzo e la sua dimensione. Gli altri due argomenti servono per passare parametri stringa all'assembly quando viene richiamato.
Questo PICO si limita a richiamare l'assembly con gli argomenti forniti. Non tenta in alcun modo di acquisire l'output.
Se devi fornire input tramite STDIN o acquisire l'output da STDOUT, devi modificare il tuo loader per usare chiamate API WIN32 come CreatePipe() e SetStdHandle() e collegare i dispositivi di I/O standard del tuo processo a una pipe anonima. Poi puoi leggere e scrivere da essa come al solito.
clr.h direttamente nel PICO.