鱼C论坛

 找回密码
 立即注册

[转载] 缓冲区溢出攻击演示程序

已有 631 次阅读2013-8-4 00:21

^_^  转载自  :  http://www.lingdlz.programfan.com   作者:江南孤峰: 2007--11--2   


缓冲区溢出攻击演示程序

  缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见:

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)可以使用入侵检测工具。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部