pwn简单栈溢出

作为队伍里稍微会一点逆向的小白,开坑pwn也确实遇到了许多问题,暴露出很多基础知识的欠缺,直至编写本文时,编者从未在任何比赛中触碰过pwn,更多的时候是对pwn深深的“恐惧”,这也是许多人的通病,也导致精通pwn的人都被业界称为“pwn爷爷”甚至“pwn祖宗”,可见pwn在ctf领域中是一座冰山,很少有人触及,小编由于在最近的几场比赛中深深被pwn拖了后腿,因此决定在闲暇之余会一会这座“冰山”,以后的几期中,小编将记录下自己学习的历程,希望能在二进制这方面有所收获,也希望正在阅读本文的你能绕过小编踩过的坑。

今天记录一下开坑的第一个程序,虽然程序很简单,但是收获了不少东西

首先我们拿到一个名为icecream的Linux下可执行ELF文件,用file命令查看文件属性

图片一

可以看到这是一个32位程序

接着我们检查一下程序开启了哪些保护措施

图片二

接下来我们来运行程序

图片二

程序很简单,给了我们一个输入点 ,这其实是一个最简单的溢出问题,如果有接触过c语言的小伙伴们在编写程序时,当一个输入点超出了接收函数的处理范围,就会造成诸如卡死、闪退、乱码的情况。而本例的思路也很常规,即通过可控输入点,令输入字符串长度足以覆写掉函数返回地址(EIP),使得函数执行完毕后自动跳转到我们需要其跳转到的地址,这样我们就可以执行我们的shellcode,pwn掉程序。

下面我们来判断一下输入点距离EIP需要填充多少个字符串

图片二

运行程序

图片二

运行到输入点,输入刚刚生成的字符串

图片二

提示了无效的返回地址

图片二

这样我们就得到了返回地址,下面计算一下输入点到EIP的偏移量

图片二

我们需要将shellcode保存到bss段中,bss段的地址可以在ida中查看

图片二

可以看到执行shellcode成功

图片二

图片二

坚持原创技术分享,您的支持将鼓励我继续创作!