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
相关产品推荐
相关产品推荐

