在缓冲区溢出攻击实验(一)(二)分别介绍了先关知识和shellcode机器码的获得,这一篇就阐述怎么利用别人程序中的缓冲区溢出漏洞实施攻击;
三、缓冲区溢出漏洞攻击
1.一个存在缓冲区溢出漏洞的demo
下面的一个demo程序使用了strcpy()函数,而这个函数不是安全的,其并不对参数数组的越界进行检查;而且程序接受用户输入,这就成了经典的受攻击案例(velnerable.c);
#include<stdio.h>
#include<string.h>
/*unsigned long get_sp(){
__asm__("movl %esp,%eax");
}*/
void main(int argc,char*argv[]){
char buffer[512];
if(argc>1){
strcpy(buffer,argv[1]);
printf("input buffer size:%d\n",strlen(argv[1]));
}
}
2.怎么攻击上面那个demo
根据前面的分析,上面的demo程序是存在缓冲区溢出漏洞的,其buffer数组接受用户输入,并且没有对数据的越界做检查,这样,只需要对buffer写入越界的数据,并设计好填充栈返回单元的地址,就可以利用demo获取shell了。还有个问题,也是前面提到的问题,我们shell的机器码数据应该存放在什么地方;当然是受攻击的demo程序中,demo程序中以为可以提供给我们写入数据的就是buffer数组了。好的,那就把机器码写入到demo程序的buffer数组中去。又有一个问题了来了,写入了buffer数组,怎么才能获得我们写入机器码的地址呢?看到《smashing the stack for fun and profit》中说,几乎所有的程序的栈起始地址都是一样的,这样就可以在我们的恶意程序中直接获得demo程序的栈起始地址了。
获取栈起始地址:sp.c
#include<stdio.h>
unsigned long get_sp(void){
__asm__("movl %esp,%eax");
}
void main(){
printf("0x%x\n",get_sp());
}
如果真是向上面说的那样,每次运行sp程序得到的结果应该是一样的,即栈的起始地址不会改变;但是,事实不是这样的&