PWN中测量变量溢出长度的三种姿势
0x1 前言
在Pwn的题目中,测量变量溢出长度当然是每个Pwn手的必修课,绝大多数题目都有着可以溢出的变量,这也是Pwn手做题的基础,但你知道有几种方法可以测量呢,如果大家只会一种方法的话并不要紧,本文将介绍两种在不同环境下的使用方法。通过本文的学习,希望大家可以在做题的过程中丰富自己的知识,多一种解题的思路。
0x2 正文
首先我们来介绍第一种方法,这是最简单也是最适合新手的方式,就是在IDA中的静态调试。只用肉眼的观看,便可以知道变量的溢出长度是多少,下面就来用一道简单的题作为例子吧
如上图,将题目文件拖入ida后可发现危险函数gets函数。双击进入变量s
可以发现,这个s很明显只有64个字节的大小。但事实真的是如此吗?这个时候就可以使用第二种方法判断真假。即GDB动态调试,使用动态调试测算溢出的长度,与ida测出的长度进行比较,便可以确定最终的溢出长度。
Part 2:动态调试测量溢出长度
首先,打开我们的Linux终端,调出GDB进行动态调试。
题目让我们输入一串数据,这边先随意输入一串数据。观察它在栈中的位置。
输入stack 40 查看栈的结构,如下图
其实,刚刚输入的数据所在的地址并不是esp所在的地址,而是eax所在的地址,做题时一定要牢记哦。
如上图,我们找到了栈底的位置,这个时候简单计算即可得到答案
居然是108个字节,是不是很神奇。跟ida所调试的完全不一样
(注:因为栈是从高地址向低地址增长的,所以一定是用栈底的ebp减去eax算出这两个寄存器之间的距离)
此时可能有小伙伴觉得上面的操作太麻烦了,怎么办呢,这里就要使用第三种测量溢出长度的姿势了。
Part 3:使用Cyclic指令测量溢出长度
cyclic指令可以生成任意长度的字符串,这里我们先生成一个200长度的字符串
如上图,我们将生成的字符串输入程序,成功发生了溢出,红色的报错已经告诉了我们溢出的地址,此时使用cyclic的另一条指令(cyclic -l +溢出的地址)
成功测量到了溢出长度为112,这条指令的意思就是判断溢出点距离我们变量的底部位置有多少个长度。
那么这个时候又有小伙伴会问了,静态调试和动态调试不一样该怎么办呢?我是该相信动态调试还是ida中的结果呢?
其实,动态调试相对于静态调试来说更加准确,我们在大多数情况下,要首先相信动态调试的结果,可以根据动态调试的结果进行变量的溢出哦~
0x3 总结
以上就是本文介绍的三种测量变量溢出的方法了,希望小伙伴们在日后做题时,熟练的运用它们,使成绩更上一层楼!
评论已关闭