PWN入门-栈溢出
缓冲区溢出之栈溢出(strcpy)
预备知识
缓冲区溢出简单介绍
缓冲区溢出:简单的说,缓冲区溢出就是超长的数据向小缓冲区复制,导致数据超出了小缓冲区,导致缓冲区其他的数据遭到破坏,这就是缓冲区溢出。而栈溢出是缓冲区溢出的一种,也是最常见的。只不过栈溢出发生在栈,堆溢出发生在堆,其实都是一样的。
栈的简单介绍
栈是一种计算机系统中的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来),是一种特殊的线性表。栈的操作常用的有进栈(PUSH),出栈(POP),还有常用的标识栈顶和栈底。
- 进栈(PUSH):将一个数据放入栈里叫进栈(PUSH)
- 出栈(POP):将一个数据从栈里取出叫出栈(POP)
- 栈顶:常用寄存器ESP,ESP是栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
- 栈底:常用寄存器EBP,EBP是基址指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

实例分析
源代码:
|
我们设定的密码是12345,但如果不开栈保护编译的话,我们输入qqqqqqqq同样会被判断密码正确。
分析exe文件
搜索字符串plz input your password,并在scanf处下断点

可以看到Dest的空间为0C-04=8个字节,当strcpy为8个字节时,程序会导致栈溢出覆盖掉返回值ret_num。具体点来说就是我们输入的“qqqqqqqq”为8个字节,但是c语言中字符串后面还有“字符串截断符\x00”,这个截断符\x00将var_4由原来的01覆盖为00,这样就输出了最终的“Success!You are right!”
End
这便是最基本的栈溢出例子,如果结合C语言中函数调用和栈帧的知识,能够覆盖函数的返回地址,那就可以控制程序流。笔者将在ROP一节中具体讲解此类攻击方法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Zechariahの博客!