缓冲区溢出学习笔记1
前几天无聊翻了翻百度网盘,发现有几节缓冲区溢出的课。点进去听了一下,还挺感兴趣的,然后就在自己电脑上实践了一下,做了第一节课的实验,在这里记录一下。
前期准备工作就是安装IDA pro 和 Ollydbg ,工具都是在吾爱**论坛上找的,安装没遇到什么问题,就是和视频里工具的界面不太一样,问题不大,凭借我过人的才智,哈哈哈,不是很轻松的搞定了。
首先是写一个c语言小程序#include <stdio.h> #include <string.h> char name[] = "jiangye"; int main() { char buffer[8]; strcpy(buffer, name); printf("%s",buffer); getchar(); return 0; }
大概意思就是字符串复制进我定义的buffer缓冲区里,然后从缓冲区里读出打印出来。拖进ollydbg和IDA pro看一看。
注意是把可执行文件拖进去,也就是后缀名exe的文件。
先通过IDA找到起始地址。由于是第一次用,记录的详细一些,按空格就能看到相应的地址。
就这样找到了主函数的地址。然后用ollydbg跳转到这里。
在这里要记录一下各个命令
在这要多记录一下,F2是设置断点,然后按F9执行到断点。
找到strcpy函数,然后设置断点执行到这,之后观察栈的变化。在这可以看到:call命令下的地址是401362,同时我们也注意栈顶元素变化。继续按F7。
可以看到,call命令下的地址已经入栈了,然后我们打开一个字符串长度大于缓冲区的程序。源码如下:
#include "stdio.h" #include "string.h" char name[] = "jiangyejiangye1111111111aaaaaaaaaaaaaaaaaa"; int main() { char buffer[8]; strcpy(buffer, name); printf("%s",buffer); getchar(); return 0; }
这里要注意看,60FEEC这个地址存放着call语句的下一条语句的地址。由于字符串过长,这个地方一会就会被覆盖,嘿嘿嘿~
其实是return时的地址被覆盖了,导致return往回跳转的时候跳不回去,再po张图吧,上面错误的就不删除了,当做是教训吧~
这张图上是正常return回去的地址,现在被长的字符串覆盖了。
其实原理是对的。只是call的语句找错了。。应该是这条语句。。他的下一条语句的地址就是4010FD了,就这样完美解决。。
实验总结一下吧,第一次玩这个东西,还是有很多不懂的地方,但是我觉得这个东西特别吸引我,不断钻研奋斗,这就是hacker精神。希望以后可以自己分析一个软件有没有后门。。接下来再贴一段知识性的总结吧。
至此,大家应该已经了解了缓冲区溢出漏洞的原理,它就是因为我们输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符将返回地址覆盖掉了,当我们的函数需要返回的时候,由于此时的返回地址是一个无效地址,因此导致程序出错。
那么依据这个原理,假设我们所覆盖的返回地址是一个有效地址,而在该地址处又包含着有效的指令,那么我们的系统就会毫不犹豫地跳到该地址处去执行指令。因此,如果想利用缓冲区溢出的漏洞,我们就可以构造出一个有效地址出来,然后将我们想让计算机执行的代码写入该地址,这样一来,我们就通过程序的漏洞,让计算机执行了我们自己编写的程序。而具体的关于漏洞利用的知识,我会在下一节课中给大家详细讲解。