linux漏洞挖掘基础--缓冲区溢出基础实例(protostar stack0)
初学,记录,欢迎指点批评。。。
用的是http://exploit-exercises.com/网站上的protostar虚拟机镜像
缓冲区溢出原理就不提了
缓冲区溢出第一关stack0
#include<stdlib.h> #include<unistd.h> #include<stdio.h> int main(int argc, char **argv) { volatileint modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } }
这也是最简单的一关,直接看他给的代码就知道直接输入65个字符就行了。不过能看出来不行,还得看到里面去,它为什么能行。
进入/opt/protostar/bin下
gdb stack0
命令:disas main 反汇编main函数如下图显示
main+0到main+6都是函数初始化指令
给main函数下断点 : b main
运行:r 或 run
看下各寄存器:info reg
可以 看到eip指向0x80483fd就是main+9,通过一开始的反汇编知道该处指令是movl $0x0,0x5c(%esp) 是modified = 0
单步执行:n 或 next
main+17:lea $0x1c(%esp),%eax ; char buffer[64] //0x5c减去0x1c正好是十进制的64
单步执行 : n 就要开始输入数据,输入的数据长度为65个字符
通过代码知道定义的缓冲区长度是64,我们输入65个字符肯定放不下。前面知道%esp+0x5c即modified的值的地址,值为0
可以看到现在modified的值已经是A,所以源代码中的判断if(modified != 0)为真,打印
如下
成功溢出,改变modified 的值。
----------------------------------------------在穷无非讨饭,不死终会出头。