缓冲区溢出
在嘉木的督促下,我去简略地听了一下嘉木推荐的慕课,本篇文章就所看慕课做一篇简略概述。
这一篇主要是讲越界访问和缓冲区溢出。
越界访问为什么会出现越界访问呢?这是由于数组元素可以由指针来访问,因而对数组的引用没有边界约束。因此在对数组的访问时可能会有意或无意地超越数组存储区范围而无法发现。数组存储区可看成一个缓冲区,超越数组存储区(越界访问)的写入操作称为缓冲区溢出。缓冲区溢出会被利用进行缓冲区溢出攻击,可导致程序运行失败、系统关机、重新启动等后果。造成缓冲区溢出的原因是没有对栈中作为缓冲区的数组的访问进行越界检查。
栗子这个漏洞就会给黑客留下机会。就像下面这个栗子所示一样可以看到,这个函数非常简单,只是单纯的读取一串字符,然后储存到buf中,但是开辟的缓存区只有0x10个字节大小,但是read最多可以读取0x100个字节,这样就会造成缓冲区溢出。这也就是简单地栈溢出,也就是将保存在栈中的ebp,ebx,返回地址覆盖掉。于是呢,我们就可以通过用我们输入的内容来将ebp,ebx,返回地址覆盖掉后加上自己想要执行的函数的地址,来控制程序执行自己想要执行的函数。这样就可以进行攻击啦。在这里 ...
一道简单栈溢出的wp
嘉木说这是一道简单的栈溢出题,于是我欣然打开(因为目前只会做栈溢出(羞耻))。按照做栈溢出的普通套路,首先,让我们打开迷人的ida,进行反汇编,可以看到如下所示:然后我就点开“s”,发现ida上显示的偏移量为0x68并且我找到了一个后门函数,里面有system函数于是我就写了脚本然后,发现过不去,我以为是因为有cannary保护but嘉木让我用checksec查看一下,果然如他所说,并没有cannary保护,而是不应该用它给的后门函数,而是直接用system函数,并且上面的偏移量也是错的,经过gdb调试后,发现实际偏移量为0x70