You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何截断64位十六进制地址并按要求格式化输出

JavaScript实现64位十六进制内存地址提取逻辑

场景说明

  • 面向Exploit脚本开发场景处理64位内存地址,示例输入地址为0x00708001e9ab0b10
  • 处理规则:移除地址高7位十六进制固定段0070800,优先返回补零后的完整64位地址格式0x00000001e9ab0b10,兼容短地址格式0x1e9ab0b10输出
  • 实现需规避JS数值精度问题,适配各类非标准化的地址输入格式

实现代码

/**
 * 提取64位地址目标段
 * @param {string|bigint} addr 输入地址,支持带/不带0x前缀的字符串、BigInt类型
 * @returns {Object} 返回全格式补零地址、短格式地址两个结果
 */
function extractTargetSegment(addr) {
    // 统一转换为无0x前缀的小写十六进制字符串
    let hex = typeof addr === 'bigint' 
        ? addr.toString(16) 
        : addr.trim().toLowerCase().replace(/^0x/, '');
    // 补前导零到16位,对齐64位地址标准长度
    hex = hex.padStart(16, '0');
    // 切割掉高7位固定段,取剩余有效位
    const targetSeg = hex.slice(7);
    // 生成优先要求的全格式补零地址
    const fullAddr = '0x' + targetSeg.padStart(16, '0');
    // 生成兼容的短格式地址
    const shortAddr = '0x' + targetSeg.replace(/^0+/, '');

    return { full: fullAddr, short: shortAddr };
}

// 测试验证
const input = '0x00708001e9ab0b10';
const res = extractTargetSegment(input);
console.log(res.full);  // 输出: 0x00000001e9ab0b10
console.log(res.short); // 输出: 0x1e9ab0b10

实现说明

  • 全程使用字符串+BigInt处理逻辑,完全规避JS中Number类型存储超过53位整数时的精度丢失问题,避免地址计算错误导致Exploit失效
  • 未采用硬编码切割固定字符长度的方案,先将输入归一化为标准16位十六进制格式再做偏移切割,可兼容不同调试工具、漏洞读取接口输出地址时前导零个数不统一、大小写混合、有无0x前缀的边界场景
  • 同时返回两种要求的格式结果,可根据ROP链构造、内存读写API的参数要求直接取用,无需二次处理

内容的提问来源于stack exchange,提问作者Terrance Turner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:45:56