当前位置:首页 > 未分类 > 正文内容

PWN 中测量变量溢出长度的三种姿势

admin2天前未分类10

0x1 前言

在 Pwn 的题目中,测量变量溢出长度是每个 Pwn 手的必修课,绝大多数题目都存在可溢出的变量,这也是 Pwn 手解题的基础。但你知道有几种测量方法吗?即使目前只会一种也没关系,本文将介绍三种在不同场景下适用的测量方法。通过本文的学习,希望能帮助大家丰富解题思路,在做题过程中更灵活地应对溢出长度测量问题。

0x2 正文

首先介绍第一种方法 ——IDA 静态调试,这是最简单且适合新手的方式,仅通过肉眼观察就能初步判断变量的溢出长度。下面以一道简单题目为例展开说明:

img

如上图所示,将题目文件拖入 IDA 后,可发现危险函数gets。双击进入gets函数的参数变量s,查看变量详情:

img

从 IDA 的静态分析结果来看,变量s的大小为 64 字节。但这个结果是否绝对准确呢?此时就需要第二种方法 ——GDB 动态调试来验证,通过动态调试测算实际溢出长度,并与 IDA 的静态结果对比,最终确定真实的溢出长度。

Part 2:动态调试测量溢出长度

动态调试依赖 GDB 工具,通过实时观察程序运行时的栈结构,计算变量到栈底(或返回地址)的距离,从而得到准确的溢出长度。具体步骤如下:

  1. 启动 GDB 调试:打开 Linux 终端,输入gdb ./题目文件启动调试,运行程序后随意输入一串测试数据(如aaaaa),观察数据在栈中的位置。

img

  1. 查看栈结构:输入stack 40命令查看栈的详细结构,重点关注输入数据的存储地址与寄存器的对应关系。

img

注意:输入数据所在的地址通常对应eax寄存器,而非esp寄存器,这一点在计算时需特别注意,避免地址混淆。

  1. 定位栈底与计算距离:通过info registers查看ebp寄存器的值(栈底地址),再结合输入数据的存储地址(eax值),计算两者之间的差值 —— 由于栈从高地址向低地址增长,溢出长度需用 “栈底地址(ebp) - 输入数据地址(eax)” 计算。

img

img

从动态调试结果来看,实际溢出长度为 108 字节,与 IDA 静态分析的 64 字节存在差异 —— 这也体现了动态调试的准确性,避免了静态分析中可能存在的栈对齐、编译器优化等干扰因素。

Part 3:使用 Cyclic 指令测量溢出长度

如果觉得手动计算栈地址差值过于繁琐,可使用 GDB 的cyclic指令快速定位溢出点。cyclic能生成具有唯一标识的字符串,通过溢出后报错信息中的 “崩溃地址”,直接反推出溢出长度,步骤如下:

  1. 生成 Cyclic 字符串:输入cyclic 200生成长度为 200 的唯一标识字符串(长度需大于预估的溢出长度,确保能覆盖到返回地址)。

img

  1. 触发溢出并获取崩溃地址:将生成的 Cyclic 字符串输入程序,程序会因溢出崩溃,此时报错信息中会显示 “覆盖返回地址的 Cyclic 子串”(如0x6161616c)。

img

  1. 计算溢出长度:输入cyclic -l 崩溃地址(如cyclic -l 0x6161616c),指令会自动反推该子串在 Cyclic 字符串中的位置,这个位置就是变量到返回地址的溢出长度。

img

从结果可知,溢出长度为 112 字节 ——cyclic指令的优势在于无需手动计算地址差值,尤其适合栈结构复杂或地址偏移不直观的场景。

关于 “静态与动态结果不一致” 的说明

当 IDA 静态分析与 GDB 动态调试结果不一致时,优先相信动态调试结果。原因如下:

  1. 静态分析无法完全还原编译器优化(如栈对齐、变量内存分配调整);

  1. 动态调试能实时反映程序运行时的真实栈结构,不受静态反编译的 “理论模型” 影响;

  1. 若需进一步验证,可结合cyclic指令的结果,三者交叉对比后确定最终溢出长度。

0x3 总结

本文介绍的三种测量变量溢出长度的方法各有适用场景:

  • IDA 静态调试:适合快速初步判断,新手入门首选,缺点是可能受编译器优化影响;

  • GDB 动态调试:准确性最高,能反映真实栈结构,适合验证静态结果或复杂栈场景;

  • Cyclic 指令:高效便捷,无需手动计算地址,适合快速定位溢出点。

希望大家在后续做题中熟练运用这三种方法,根据题目场景灵活选择,提升解题效率与准确性!

作者:Hanser

排版:十三年网络安全社团

原文链接:https://mp.weixin.qq.com/s/mT4TGLSSuI7bdfR2aou0pQ

若你后续还需要补充其他 PWN 技术文章的格式转换,或者想对现有内容中的代码示例、操作步骤进行细化(比如添加 GDB 命令的详细解释),可以随时告诉我,我会进一步优化内容,让技术细节更清晰易懂。


扫描二维码推送至手机访问。

版权声明:本文由克拉玛依三十年社团发布,如需转载请注明出处。

本文链接:https://www.klmyssn.com/?id=69

分享给朋友:

“PWN 中测量变量溢出长度的三种姿势” 的相关文章

(原创)看我用各种姿势在手机和PC查看到连接到的wifi密码

(原创)看我用各种姿势在手机和PC查看到连接到的wifi密码

今天一个女神来我家做客,她问我WiFi密码,然而我却奇迹般的忘记了(特么的当时心里一万个草泥马踏过去),让我在她面前尴尬求子的,所以为了防止你们也出现这种情况,我特地把各种方法整理了一下,那么感兴趣的朋友们继续往下看吧! 用电脑的cmd命令行查看密码 1.按住Windows键和R键,在跳出来的运...

(原创)求人不如求己 -- 剪辑音乐就是这么简单 [如何剪辑音乐]

(原创)求人不如求己 -- 剪辑音乐就是这么简单 [如何剪辑音乐]

每每到了学校有活动,需要播放歌曲时,QQ 就多几个好友,消息又 99+,不消问什么事情,就知道是找我剪辑歌曲的同学了。怎么说,我这人对别人提出的需求,都尽力去帮助的,在剪辑音乐这事情上,从没拒绝过,但年复一年,每次剪辑音乐其实很简单,但是量多,就比较影响自己时间了,我又不会拒绝别人,很是尴尬,所以...

(原创)还在用软件翻墙?看我几秒搞定!

首先说下原理,修改设备 hosts 文件信息,将各大国外网站域名直接指向服务器 ip,绕过国家的 GFW 防火墙,从而可以访问 Google、Facebook、ebay、YouTube、Yahoo、、、太多还是不打了,自己测试-------------------------------------...

(原创)sqlmap 注入初级教程 [sqlmap][sqlmap 指令][sqlmap 怎么用]

(原创)sqlmap 注入初级教程 [sqlmap][sqlmap 指令][sqlmap 怎么用]

一、熟悉 sqlmap 之路:核心注入场景与方法1. Sqlmap 之 Post 注入Post 注入适用于表单提交(如登录页、数据提交页)等场景,核心是通过抓取 Post 请求数据进行注入测试,以下为 4 种常用方法:方法一:基于请求文件(-r 参数)# 基础用法(请求文件与sqlmap同目录)sq...

(原创) 校园卡破解系列之数据修改 [pm3 破解饭卡][pm3 修改数据][校园卡修改][IC 卡修改数据]

(原创) 校园卡破解系列之数据修改 [pm3 破解饭卡][pm3 修改数据][校园卡修改][IC 卡修改数据]

(二)吃不完的饭卡提升完 IC 卡权限,就该考虑能不能修改饭卡金额了。通过两次消费前后饭卡数据的对比分析,发现虽然卡片数据包含较多扇区和区块,但消费前后变化的地方仅涉及两个扇区,这为后续分析提供了便利。通过十六进制与十进制转换,可进一步拆解变化的数据:消费后金额:373.2(数字:37320;16...

带你挖掘文件包含漏洞之代码审计 #4 实战五个案例

带你挖掘文件包含漏洞之代码审计 #4 实战五个案例

在 PHP 安全中,文件包含漏洞是危害严重的漏洞!本文不再讲解基础概念,直接进入实战环节。一、文件包含漏洞挖掘要点核心关键字:require()、require_once()、include()、include_once()(注意:函数名中括号与参数间存在空格,效果相同);本次实战对象:CMS 系统...