缓冲区溢出攻击演示程序
缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见:
http://blog.programfan.com/article.asp?id=30692
下面是小型的攻击演示程序,程序源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void callCmd(){
printf("welcome admin !\n");
system("cmd");
}
void test(char p){
char buf[10];
printf("Enter passport:");
gets(buf);
if(!strcmp(buf,"admin"))
callCmd();
printf("Access deny !\n");
}
int main(){
char buf='A';
test(buf);
return 0;
}
上面的程序在正常执行时只有输入正确的"通行证" "admin" 才有权调用callCmd() 函数,但是由于使用了 gets() 函数,可以在输入时通过缓冲区溢出,将test()的返回地址直接改为callCmd() 函数的调用地址绕过验证,方法如下:
一 : 反汇编该程序生成的可执行文件,找到 callCmd() 的调用地址 : 00401030
二: 查看堆栈内容 { 调出堆栈,后面将会用到 }
三: 运行函数调用指令,同时查看堆栈以找到堆栈的返回地址位置
四:正常输入,并查看堆栈得出缓冲区距离堆栈的距离 [ 16 字节]
五: 万事具备,只剩修改返回地址了,从前面我们知道返回地址为 00401030
如何输入?我们不能直接用键盘敲入非打印字符,这里我是用 UltraEdit 编辑复制得到的,如下:
六: 演示
1) 正常输入,被拒绝
2) 缓冲区攻击,绕过验证
此时的堆栈如下 :
这里我们是知道了源代码,如果只有可执行文件,则需要反汇编工具调试可执行代码,可以进行轰炸式攻击以找出能够导致缓冲区溢出的地方,另外这里没有值入可执行代码而是执行了原文件中的代码,还可以直接值入可执行代码到缓冲区,修改返回地址为值入代码的位置即可。要进行缓冲区溢出攻击,必须熟悉汇编语言,精通反汇编调试,还要有还的反汇编工具…… {{ 仅供学习参考,反对不良攻击,呵呵…… }}
避免缓冲区溢出攻击方法: 1)有些系统自带了工具不允许执行堆栈中的指令,可以开启这些功能,这样能够避免堆栈值入代码攻击,但避免不了演示程序里的这种攻击。2)编写程序的时候避免使用能够导致缓冲区溢出的函数(C里面大多数字符串函数都不安全)。3)可以使用入侵检测工具。
江南孤峰: 2007--11--2
^_^ 转载请注明出处 ^_^ : http://www.lingdlz.programfan.com
评论