正文

缓冲区溢出攻击演示程序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

阅读(9089) | 评论(2)


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

评论

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