下面是本次用到的实验文件meet.c,该文件存在一个缓冲区漏洞,详细文件如下:
//meet.c
#include <stdio.h>
#include <string.h>
greeting(char *temp1,char *temp2){
char name[400];
strcpy(name,temp2);
printf("hello %s %s\n",temp1,name);
}
main(int argc,char * argv[]){
greeting(argv[1],argv[2]);
printf("Bye %s %s\n",argv[1],argv[2]);
}
在gcc环境下我们通过【#gcc -g -fno-stack-protector -o meet meet.c】命令,编译出meet可执行文件 (-fno-stack-protector选项的作用是为了关闭linux栈的保护机制,有助于我们验证缓冲区溢出的学习)接着:
#./meet mr `perl -e 'print "A" x 600'` //这里运用perl语言往缓冲区填充600个字符,不懂perl语言的可以网上参考相关资料.
Segmentation fault //这里爆出的信息说明我们name为400字节的缓冲区溢出了
#gdb -q meet //使用gdb来调试程序,看看eip是否改变了
(gdb) run mr `perl -e 'print "A" x 600'`
Program received signal SIGSEGV,Segmentation fault.
(gdb)info reg eip
eip 0x4112356c 0x4112356c`//从这里我们就可以发现eip已经指向了内存一块很远的地方。
现在我们发现eip已经指向了一块我们不认识的地方,说明程序中某个地方的栈针被破坏了,该程序进行了多次嵌套函数调用,因此存在多个栈帧。如果写入的数据超过了栈压入EIP的位置,就会将从temp1开始的函数参数覆盖,我们这里使用gdb进行验证,截图如下:


从图上显示,我们发现temp1,temp2指向地址0x41414141处,再使用gdb,我们来确认到底是从那个字符开始出现了这种情况,再次使用gdb:
#run Mr `perl -e 'print "A" x 400'`
#run Mr `perl -e 'print "A" x 401'`
...
#run Mr `perl -e 'print "A" x 408'`
Program reveived signal SIGSEGV,Segmentation fault.
下面是图片详细,我们可以看到,当我们往缓冲区输入408个字符的时候,在0x41414141处temp就gg了,所以我们就知道了,当缓冲区里有408个字符,就开始溢出了。

当我们知道溢出字符的个数的时候,我们这里就开始重复返回地址,漏洞攻击中最重要的因素是返回地址的值,必须完美对其并对其进行重复,一直将栈上保存的EIP值覆盖。通过使用”asm(“movl %esp,%eax”)内联汇编,我们就可以知道当前ESP的值。具体这个c代码我就不介绍了,几行代码,相信大家通过百度都能够知道
#./get_sp //注意这个是get_sp.c编译后的可执行程序,get_sp.c就是来获取esp值用的,大家自己百度一下,代码太短,不想写了。
Stack pointer (Esp):0xbffff418
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-94771-2.html
去努力
可怜的伊拉克连反恐的自由也没有了