正文

缓冲区溢出攻击演示程序2007-11-02 21:27:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/30693.html

分享到:

缓冲区溢出攻击演示程序   缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见: 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

阅读(9257) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册