Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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
SilentMoonwalk — Implementazione di un PoC di uno spoofer dello stack di chiamate completamente dinamico. | Kitploit
Strumenti/GitHubGitHub/klezvirus/silentmoonwalk
ExploitReverse EngineeringAnalisi di BinariRed TeamingSviluppo Payload
GitHubklezvirus/silentmoonwalk

SilentMoonwalk

Implementazione di un PoC di uno spoofer dello stack di chiamate completamente dinamico.

Vedi Repository
9851132 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

SilentMoonwalk

Implementazione PoC di uno spoofing dello stack di chiamate completamente dinamico

TL;DR

SilentMoonwalk è un'implementazione PoC di uno spoofing dello stack di chiamate completamente dinamico, che implementa una tecnica per rimuovere il chiamante originale dallo stack di chiamate, utilizzando ROP per desincronizzare lo srotolamento dello stack dal flusso di controllo.

Autori

Questo PoC è il risultato di una ricerca congiunta sullo spoofing dello stack. Gli autori della ricerca sono:

  • KlezVirus
  • Waldo-IRC
  • Trickster0

Voglio sottolineare che questo lavoro sarebbe stato impossibile senza il contributo di Waldo-IRC e Trickster0, che hanno entrambi contribuito alle fasi iniziali del PoC e alla ricerca alla base del PoC.

Panoramica

Questo repository dimostra un'implementazione PoC per spoofare lo stack di chiamate quando si chiamano API Windows arbitrarie.

Questo tentativo è stato ispirato da questo thread su Twitter e questo thread su Twitter, dove il sensei namazso ha mostrato e suggerito di estendere l'approccio di srotolamento dello stack con una catena ROP per desincronizzare lo srotolamento dal flusso di controllo reale e ripristinare lo stack originale successivamente.

Questo PoC tenta di fare qualcosa di simile a quanto sopra e utilizza uno stack desincronizzato per nascondere completamente lo stack di chiamate originale, rimuovendo anche la base dell'immagine EXE da esso. Al ritorno, viene invocato un gadget ROP per ripristinare lo stack originale. Nel codice, questo processo viene ripetuto 10 volte in un ciclo, utilizzando frame diversi ad ogni iterazione, per dimostrare la stabilità.

Modalità Supportate

Lo strumento supporta attualmente 2 modalità, dove una è in realtà una patch errata a un frame pop RBP non funzionante identificato, che opera spostando l'attuale RSP e aggiungendo due frame fittizi allo stack di chiamate. Poiché opera utilizzando frame sintetici, mi riferisco a questa modalità come "SYNTHETIC".

Quando si seleziona il frame che si srotola tramite pop del registro RBP dallo stack, lo strumento potrebbe selezionare un frame non adatto, risultando in uno stack di chiamate tagliato bruscamente, come osservabile di seguito.

Windows 10 Call Stack - Cut

Modalità Stack di Chiamate Sintetico

Una soluzione sciocca al problema sarebbe creare due frame fittizi e collegarli allo stack di chiamate tagliato. Questo creerebbe una sorta di stack di chiamate apparentemente legittimo, anche senza un frame adatto che si srotoli chiamando POP RBP, ma:

  • Perderesti il vantaggio della tecnica di desincronizzazione
  • Lo stack sarebbe comunque srotolabile
  • Lo stack di chiamate risultante potrebbe sembrare legittimo a prima vista, ma probabilmente non supererebbe un controllo rigoroso

Il risultato dello spoof sintetico può essere osservato nell'immagine qui sotto:

Windows 10 Call Stack - Apparently Legit, non unwoundable - getchar

Figura 1: Windows 10 - Stack di chiamate apparentemente legittimo, non srotolabile, in cui il modulo EXE è stato completamente rimosso (chiamata alla funzione getchar senza parametri)

Nota: Questa modalità operativa è disabilitata per impostazione predefinita. Per abilitarla, imposta CALLSTACK_TYPE su 1

Modalità Stack Desincronizzato

Questa modalità è la soluzione corretta al problema sopra, in cui il frame non adatto viene semplicemente sostituito con un altro, adatto.

Windows 10 Call Stack - Legit, unwoundable - MessageBoxExA

Figura 2: Windows 10 - Stack di chiamate legittimo, srotolabile, in cui il modulo EXE è stato completamente rimosso (chiamata alla funzione MessageBoxA con 4 parametri)

Utilità

Nel repository, puoi trovare anche una piccola utility per ispezionare le funzioni runtime, che potrebbe essere utile per analizzare le voci delle funzioni runtime.

root@kitploit:~
UnwindInspector.exe -h

 Unwind Inspector v0.100000

 Mandatory args:
   -m <module>: Target DLL
   -f <function>: Target Function
   -a <function-address>: Target Function Address

Sample Output:

root@kitploit:~
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] Using function address 0x7ffaae12182c

  Runtime Function (0x000000000000182C, 0x00000000000019ED)
  Unwind Info Address: 0x000000000026AA88
    Version: 0
    Ver + Flags: 00000000
    SizeOfProlog: 0x1f
    CountOfCodes: 0xc
    FrameRegister: 0x0
    FrameOffset: 0x0
    UnwindCodes:
    [00h] Frame: 0x741f - 0x04  - UWOP_SAVE_NONVOL     (RDI, 0x001f)
    [01h] Frame: 0x0015 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0015)
    [02h] Frame: 0x641f - 0x04  - UWOP_SAVE_NONVOL     (RSI, 0x001f)
    [03h] Frame: 0x0014 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0014)
    [04h] Frame: 0x341f - 0x04  - UWOP_SAVE_NONVOL     (RBX, 0x001f)
    [05h] Frame: 0x0012 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0012)
    [06h] Frame: 0xb21f - 0x02  - UWOP_ALLOC_SMALL     (R11, 0x001f)
    [07h] Frame: 0xf018 - 0x00  - UWOP_PUSH_NONVOL     (R15, 0x0018)
    [08h] Frame: 0xe016 - 0x00  - UWOP_PUSH_NONVOL     (R14, 0x0016)
    [09h] Frame: 0xd014 - 0x00  - UWOP_PUSH_NONVOL     (R13, 0x0014)
    [0ah] Frame: 0xc012 - 0x00  - UWOP_PUSH_NONVOL     (R12, 0x0012)
    [0bh] Frame: 0x5010 - 0x00  - UWOP_PUSH_NONVOL     (RBP, 0x0010)

Compilazione

Per compilare il POC e osservare un comportamento simile a quello nell'immagine, assicurati di:

  • Disabilita GS (/GS-)
  • Disabilita l'Ottimizzazione del Codice (/Od)
  • Disabilita l'Ottimizzazione dell'Intero Programma (Rimuovi /GL)
  • Disabilita la preferenza di dimensione e velocità (Rimuovi /Os, /Ot)
  • Abilita intrinsic se non abilitato (/Oi)

Lavori Precedenti

Vale la pena menzionare i lavori precedenti su questo argomento, che hanno gettato le basi di questo lavoro.

  • Return Address Spoofing: Tecnica e idea originale, di Namaszo. Ogni altro PoC di cui sono a conoscenza è stato costruito su di esso.
  • YouMayPasser: Questo straordinario lavoro di Arash è la prima estensione correttamente realizzata del PoC Return Address Spoofing di Namaszo.
  • VulcanRaven: Uno spoofing dello stack di chiamate che opera creando sinteticamente un Thread Stack che rispecchia un altro stack di chiamate reale.
  • Unwinder: Una bella implementazione PoC in Rust di uno spoofing dello stack di chiamate che opera analizzando le informazioni del codice di srotolamento per sostituire i frame nello stack di chiamate.

Riconoscimenti

  • Un enorme ringraziamento a waldo-irc e trickster0, che hanno collaborato con me in questa ricerca. Devo tutto a loro.
  • Tutto il merito dell'idea alla base di questo va a namaszo, che personalmente considero un genio. Ha anche verificato questo PoC prima del rilascio, quindi un enorme grazie a lui.

Note

  • [SOLO STACK SINTETICO]: Per una limitazione nel modo in cui localizzo i gadget, il numero massimo di argomenti è al momento 8 (è TRIVIALE modificare e aggiungere più parametri, ma non ho avuto voglia).
  • [SOLO STACK DESINCRONIZZATO]: Per una limitazione nel modo in cui configuro lo spoofing, il numero massimo di argomenti supportati è al momento 4.
  • I test su questo sono stati piuttosto limitati. Potrebbero esserci eccezioni di cui non sono a conoscenza al momento.
  • Lo srotolamento che coinvolge registri a 128 bit non è stato testato.
  • Chiamare funzioni che utilizzano registri a 128 bit non è ufficialmente supportato.
Scarica lo strumento