Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
DeathSleep — Un'implementazione PoC per una tecnica di evasione per terminare il thread corrente e ripristinarlo prima di riprendere l'esecuzione, mentre si implementano modifiche alla protezione delle pagine durante la non esecuzione. | Kitploit
Strumenti/GitHubGitHub/janoglezcampos/deathsleep
ExploitAnalisi MalwareRed TeamingSviluppo Payload
GitHubjanoglezcampos/deathsleep

DeathSleep

Un'implementazione PoC per una tecnica di evasione per terminare il thread corrente e ripristinarlo prima di riprendere l'esecuzione, mentre si implementano modifiche alla protezione delle pagine durante la non esecuzione.

Vedi Repository
5387784 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

██████╗ ███████╗ █████╗ ████████╗██╗ ██╗███████╗██╗ ███████╗███████╗██████╗ ██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██║ ██║██╔════╝██║ ██╔════╝██╔════╝██╔══██╗ ██║ ██║█████╗ ███████║ ██║ ███████║███████╗██║ █████╗ █████╗ ██████╔╝ ██║ ██║██╔══╝ ██╔══██║ ██║ ██╔══██║╚════██║██║ ██╔══╝ ██╔══╝ ██╔═══╝ ██████╔╝███████╗██║ ██║ ██║ ██║ ██║███████║███████╗███████╗███████╗██║
╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝╚═╝

Una implementazione PoC per una tecnica di evasione che termina il thread corrente e lo ripristina prima di riprendere l'esecuzione, implementando cambiamenti di protezione delle pagine durante la mancata esecuzione.

Introduzione

I metodi di sleep e offuscamento sono ben noti nella comunità maldev, con implementazioni diverse, hanno l'obiettivo di nascondersi dagli scanner di memoria durante il sonno, solitamente cambiando le protezioni di pagina e aggiungendo anche funzionalità interessanti come la crittografia dello shellcode, ma c'è un altro punto importante per nascondere il nostro shellcode: nascondere il thread corrente di esecuzione. Spoofare lo stack è figo, ma dopo averci pensato un po' ho pensato che non c'è bisogno di spoofare lo stack… se non c'è stack :)

L'usabilità di questa tecnica è lasciata alla valutazione del lettore, ma in ogni caso, penso sia un modo interessante per rivedere alcuni argomenti e imparare un po' di maldev per chi, come me, sta iniziando in questo mondo.

L'implementazione principale mostrata qui contiene tutto ciò di cui abbiamo bisogno per estrarre dallo stack nella sezione dati, come variabili globali, ma un'implementazione che sposti tutto nell'heap sarà pubblicata presto. Ha lo scopo di mostrare alcune modifiche chiave che devono essere apportate per rendere questo codice pic e iniettabile.

Questo repository è mirrorato tra GitHub e GitLab.


Cosa sta succedendo?

Prima di tutto

Tutto ciò che è affermato qui deriva dalla mia comprensione dei vari argomenti trattati, sia tramite lettura che esperienza durante lo sviluppo. Sono consapevole di non essere un esperto e l'ultima cosa che voglio è diffondere disinformazione, quindi se pensi che qualcosa non sia corretto, mi piacerebbe che me lo facessi notare, puoi contattarmi su twitter o aprendo issue in questo repo. Grazie mille per la tua comprensione. :)

Basi

L'obiettivo principale di questa tecnica è chiaro: terminare il thread corrente e ripristinarlo prima di riprendere l'esecuzione, ma cosa significa esattamente e quali nuovi vincoli impone?

Per poter ripristinare l'esecuzione, dobbiamo salvare due cose prima di terminare il thread: primo, lo stato della CPU, e secondo, lo stack, e impostarli di nuovo efficacemente dopo che il nuovo thread è stato lanciato.

Ho parlato di nuovi vincoli che appariranno in questa tecnica, e ce ne sono due grandi: Primo, dobbiamo memorizzare al di fuori dello stack tutto ciò di cui abbiamo bisogno dal momento in cui il thread termina fino a quando lo stack viene ripristinato, e come vedrete, crea alcune nuove sfide.

Secondo, abbiamo sempre bisogno di almeno un altro thread in esecuzione nel nostro processo, poiché stiamo terminando il nostro thread, se non ci sono altri thread il processo terminerà. Non penso che questo sia un grosso problema, poiché la maggior parte degli agenti vengono iniettati in altri processi, possiamo presumere che questo processo manterrà almeno un thread in esecuzione.

Componenti di DeathSleep:

Possiamo vedere in questo POC 4 funzioni principali:

  • Programma principale: Qui è dove scriveresti il codice del tuo agente, ed è la porzione di codice che farà uso di DeathSleep
  • Funzione Awake: questo è il punto di ingresso di tutti i nostri thread, ed è responsabile di salvare il punto di partenza dello stack che ripristineremo. Inoltre, è responsabile di ripristinare lo stack e il contesto CPU quando necessario, o semplicemente di avviare il nostro programma principale.
  • DeathSleep: questa è la funzione principale di questa tecnica, ed è responsabile di eseguire il backup del contesto del thread e dello stack, e anche di preparare tutto per la magia.
  • Rebirth: Una semplice funzione responsabile solo di lanciare i nostri nuovi thread.

Salvare lo stack.

Quando stiamo per salvare lo stack, sorge una domanda: quanto dello stack deve essere salvato?

Rivediamo prima cosa c'è nello stack dopo aver chiamato la funzione DeathSleep (questa è la funzione che salva il contesto, lo stack e prepara tutto per l'offuscamento e il ripristino)

Come possiamo vedere, ogni funzione ha tre parti:

  • Shadow space: questo è uno spazio di 32 byte, allocato dal chiamante, ma utilizzato dal chiamato. Per quanto ne so e ho potuto vedere, la sua funzione principale è contenere, se necessario, gli argomenti passati alla funzione chiamata nei registri, ma può essere utilizzato per qualsiasi cosa decida la funzione chiamata.
  • Indirizzo di ritorno: questo è l'indirizzo della prossima istruzione da eseguire nella funzione chiamante, inserito dall'istruzione CALL, quindi l'istruzione RET nella funzione chiamata prenderà semplicemente questo indirizzo e "salterà" ad esso quando termina.
  • Spazio dello stack della funzione: Questo è lo spazio riservato dal chiamato per memorizzare il valore dei registri che devono essere ripristinati e il valore delle sue variabili locali.

La porzione minima dello stack che ovviamente dobbiamo salvare è tutto ciò che è all'interno del nostro programma principale, cioè il suo shadow space, il suo indirizzo di ritorno e tutto fino alla funzione DeathSleep. Tutto ciò che precede non è realmente necessario (salvare lo stack usato dalla funzione di ingresso ha i suoi vantaggi, ma ne discuteremo più avanti), poiché quello è lo stack utilizzato dalle routine di Windows per lanciare il nostro nuovo thread. Oltre a questo, ho deciso di memorizzare anche lo shadow space della funzione DeathSleep (non realmente necessario, ma rende il calcolo dell'Rsp al momento del risveglio più facile).

Quindi alla fine, stiamo salvando questo:

Come trovare i nostri indirizzi di stack:

Ogni funzione in una compilazione standard dovrebbe essere composta da 3 parti: il prologo, il codice della funzione e l'epilogo.

L'Rsp (puntatore allo stack) dovrebbe essere modificato solo nel prologo e nell'epilogo della funzione. Il prologo aumenta il puntatore dello stack (ricorda che aumentare lo stack significa ridurre gli indirizzi, poiché vanno in direzioni opposte), per salvare i registri, per contenere tutte le sue variabili locali e poi per contenere lo shadow space, e l'epilogo fa esattamente l'opposto.

Scarica lo strumento