网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx

上传人:b****7 文档编号:24048201 上传时间:2023-05-23 格式:DOCX 页数:33 大小:736.67KB
下载 相关 举报
网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx_第1页
第1页 / 共33页
网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx_第2页
第2页 / 共33页
网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx_第3页
第3页 / 共33页
网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx_第4页
第4页 / 共33页
网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx

《网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx》由会员分享,可在线阅读,更多相关《网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx(33页珍藏版)》请在冰豆网上搜索。

网络安全与管理课程实验加密算法缓冲区溢出扫描工具.docx

网络安全与管理课程实验加密算法缓冲区溢出扫描工具

实验一缓冲区溢出调试和Superscan、X-scan、sniffer等工具的使用

实验目的:

1.掌握OllyDbg调试工具调试可执行文件的方法和步骤;

2.利用OllyDbg进行调试,观察堆栈变化,主要是esp和eip以及ebp的状态变化,在调试状态下,通过理论与实践的结合,进一步加深对缓冲区溢出的概念和原理的理解。

3.学会调试利用栈溢出,通过构造特殊字符串通过溢出的方法改变程序执行流程。

4.学习掌握Superscan的使用,并能够进行一些简单的扫描。

5.练习用X-scan来进行一些实际的扫描过程。

6.学习并掌握利用Sniffer进行简单的抓包。

实验内容与步骤:

栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。

栈的作用如同一个缓冲区,保存着函数所需的所有信息。

在函数的开始时候产生栈,并在函数的结束时候释放它。

栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。

栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。

EIP:

扩展指令指针。

在调用函数时,这个指针被存储在栈中,用于后面的使用。

在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。

ESP:

扩展栈指针。

这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。

EBP:

扩展基指针。

这个寄存器在函数的执行过程中通常是保持不变的。

它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。

这个指针通常指向函数使用栈底部。

1.通过实践来进行处理

  首先演示一下栈的形成:

下面是以下代码;

复制代码

#include

intmain()

{

_asm

{

push0x12345678

popeax

}

}

复制代码

我们可以在VC++6.0进行调试来观察一下esp和eip以及ebp的状态变化;

   我们F11来进行跟进下,就会发现esp栈顶指针会跟随变化,因为我们向栈中压人了12345678这样四个字节的数据,指针会减小4个字节的。

 

  而我们pop的时候就会发现栈顶指针就变大成为了原来的样子。

这就告诉我们一个道理栈中压人数据的时候栈顶指针是变小的,而弹出栈的时候栈顶指针是变大的。

也就是栈底地址高于栈顶地址。

  接下来演示函数内栈的调用过程。

   首先没有进入到overflow函数里面的的时候ebp和esp都是有值得,说明外面的main函数也有栈的实现。

我们反汇编看一下具体栈的实现。

F11单步走一下就会发现一个跳转jmp跳转到函数overflow。

 这时候后我们单步运行F11。

00401020pushebp

00401021movebp,esp

00401023subesp,44h

00401026pushebx

00401027pushesi

00401028pushedi

00401029leaedi,[ebp-44h]

0040102Cmovecx,11h

00401031moveax,0CCCCCCCCh

00401036repstosdwordptr[edi]

5:

intour=0;

00401038movdwordptr[ebp-4],0

6:

return;

 就会看到如上代码,这时候我们来进一步分析一下。

首先它将ebp指针压人栈内,将当前的esp指向的地址给了ebp,这时候esp减小了44h,这时候在堆栈中又开辟了一个长度为44h的一个新的栈空间。

从我们分析可以得出dwordptr[ebp-4],0这个局部变量是存放在新的栈空间里面的。

ebp-4远远小于44h空间大小。

局部变量是存放在栈中的。

  通过这个例子我们可以得出一个结论就是:

栈中存放的数据是什么?

  如果程序要调用某个函数,那么计算机就会自动将函数返回后执行的指令地址先压入栈里,等函数调用完之后再从中取出,跳转到该处执行。

溢出的原因?

 正式因为先放入栈的地址在前,而后放入栈的数据一旦过长,就会覆盖到前面的地址这就会导致程序发生错误。

下面来看一下如下的例子来演示栈溢出现象;

#include

#include

#include

voidoverflow(char*buf)

{

chardes[5]="";

strcpy(des,buf);

return;

}

voidmain(intargc,char*argc[])

{

LoadLibrary("user32.dll");

charlongbuf[100]="aaaaaaaaaaaabbbbcccccccccccc";

overflow(longbuf);

return;

}

程序一运行就会停止工作:

   下面我们来单步跟踪一下程序:

  首先先把函数下一个地址以及参数压入栈中:

   这时候但不运行到了strcopy这里:

这是我们会发现将参数的值出来放在寄存器edx里面了,请看下面图:

48FF1800

  这时候将程序运行到了ret的时候发现程序被strcopy给覆盖了。

   返回地址变成了62626262;

   这是返回地址是错误的所以就会爆出该内存不可读之类的错误提示。

   接下来的操作就是将溢出的地址跳转到一个地方然后对让它执行我们要执行的操作,执行完之后再跳转回真实的返回地址就达到了我们想要的目的。

   我们分两个环节来讲。

上面讲述的是栈溢出的原理,下面的一个章节用来将栈溢出的利用。

栈溢出的初步利用

  我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。

再进行讲一遍栈溢出的原理。

更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。

下面的例子代码如下:

#include

#include

#definePASSWORD"qqqqqqq"

intverify_password(char*password)

{

intauthenticated;

charbuffer[8];

authenticated=strcmp(password,PASSWORD);

strcpy(buffer,password);//构造栈溢出

returnauthenticated;

}

intmain()

{

intvalid_flag=0;

charpassword[1024];

while

(1)

{

printf("pleaseinputpassword:

");

scanf("%s",password);

valid_flag=verify_password(password);

if(valid_flag)

{

printf("incorrectpassword!

\n\n");

}

else

{

printf("Congratulation!

youhavepassedtheVerification!

\n");

break;

}

}

getchar();

chari;

scanf("%s",&i);

}

从上面的例子可以看出是密码有效性的验证的一个例子,是通过输入密码进行验证密码是否输入正确,首先我们现在运行下程序。

   通过输入正确密码和不正确密码的区别;

   输入7个'q'程序正常运行时的栈状态。

   如下图可以看到栈的内部情况:

   如果继续增加输入的字符,那么超出buffer[8]边界的字符将依次淹没authenticated、前栈帧EBP、返回地址。

也就是说,控制好字符串的长度就可以让字符串中相应位置字符的ASCII码覆盖掉这些栈帧状态值。

   按照上面对栈帧的分析,可以得出以下的结论:

  

(1)输入11个'q',第9-11个字符连同NULL结束符将authenticated冲刷为0x00717171。

  

(2)输入15个'q',第9-12个字符将authenticated冲刷为0x71717171;第13-15个字符连同NULL结束符将前栈帧EBP冲刷为0x00717171。

  (3)输入19个'q',第9-12字符将authenticated冲刷为0x71717171;第13-16个字符连同NULL结束符将前栈帧EBP冲刷为0x71717171;第17-19个字符连同NULL结束符将返回地址冲刷为0x00717171。

  这里用19个字符作为输入,看看淹没返回地址会对程序产生什么影响。

出于双字对齐的目的,我们输入的字符串按照"4321"为一个单元进行组织,最后输入的字符串为"4321432143214321432"(测试)。

<用OllyDbg加载程序,在字符串拷贝函数调用结束后观察栈状态。

>

下面来进行分析:

当输入7个q时,观察程序返回时堆栈的里面的内容。

   下面执行这段代码:

4321432143214321432

  实际的内存状况和我们分析的结论一致,此时的栈状态见。

请见下表的内容:

接下来我们用OD来调试下程序的运行过程:

  返回地址用于在当前函数返回时重定向程序的代码。

在函数返回的"retn"指令执行时,栈顶元素恰好是这个返回地址。

"retn"指令会把这个返回地址弹入EIP寄存器,之后跳转到这个地址去执行。

  在这个例子中,返回地址本来是0x040FACB,对应的是main函数代码区的指令,现在我们已经把这个地址用字符的ASCII码覆盖成了0x00323334。

我们可以从调试器中的显示看出计算机中发生的事件。

(1)函数返回时将返回地址装入EIP寄存器。

(2)处理器按照EIP寄存器的地址0x00323334取指。

(3)内存0x00323334处并没有合法的指令,处理器不知道该如何处理,故报错。

由于0x00323334是一个无效的指令地址,所以处理器在取指的时候发生了错误使程序崩溃。

但如果这里我们给出一个有效的指令地址,就可以让处理器跳转到任意指令区去执行(比如直接跳转到程序验证通过的部分),也就是说,我们可以通过淹没返回地址而控制程序的执行流程。

这时候我们会想到这段代码是进行对密码的验证,如果对了就显示正确信息,如果不对弹出错误消息,这时候我们可以修改这个函数返回地址,直接执行正确信息这样就达到了我们的目的;接下来我们要对程序进行一定的改进。

程序代码如下所示:

#include

#definePASSWORD"1234567"

intverify_password(char*password)

{

intauthenticated;

charbuffer[8];

authenticated=strcmp(password,PASSWORD);

strcpy(buffer,password);//overflowedhere!

returnauthenticated;

}

main()

{

intvalid_flag=0;

charpassword[1024];

FILE*fp;

if(!

(fp=fopen("password.txt","rw+")))

{

exit(0);

}

fscanf(fp,"%s",password);

valid_flag=verify_password(password);

if(valid_flag)

{

printf("incorrectpassword!

\n");

}

else

{

printf("Congratulation!

Youhavepassedtheverification!

\n");

}

fclose(fp);

}

这段代码主要改进部分是密码是从txt文件中读取出来的不是手动输入了,这样的好处就是能够用UE输入一些16进制来进行修改数据;首先我们将程序载入到OD中,看一下我们要跳转的地方地址在哪里,我们看下面这张图,我们可以清晰的看到我们要返回的地址应该是0x401122这个地址

   这时候我们在程序的同目录下面创建一个password.txt首先前面的东西可以随便输入,还是4321432143214321后面这个就要输入0x401122如下图所示:

   这时候可以看一下栈帧情况,栈帧的情况如下图所示:

  运行程序看一下结果

  

我们就可以看到我们想要的效果,当然这样修改会有问题,因为没有通过一些手段进行处理,代码里面还存在一些非法的指令因为我们修改了程序的返回地址。

由于栈内EBP等被覆盖为无效值,使得程序在退出时堆栈无法平衡,导致崩溃。

虽然如此,我们已经成功地淹没了返回地址,并让处理器如我们设想的那样,在函数返回时直接跳转到了提示验证通过的分支。

二、X-scan

1下载安装X-scan

利用X-scan扫描一台主机,分析其扫描结果。

采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能。

扫描内容包括:

远程服务类型、操作系统类型及版本,各种弱口令漏洞、后门、应用服务漏洞、网络设备漏洞、拒绝服务漏洞等二十几个大类。

对于多数已知漏洞,我们给出了相应的漏洞描述、解决方案及详细描述链接,其它漏洞资料正在进一步整理完善中,您也可以通过本站的“安全文摘”和“安全漏洞”栏目查阅相关说明。

  3.0及后续版本提供了简单的插件开发包,便于有编程基础的朋友自己编写或将其他调试通过的代码修改为X-Scan插件。

另外Nessus攻击脚本的翻译工作已经开始,欢迎所有对网络安全感兴趣的朋友参与。

需要“Nessus攻击脚本引擎”源代码、X-Scan插件SDK、示例插件源代码或愿意参与脚本翻译工作的朋友,可通过本站“X-Scan”项目链接获取详细资料:

  所需文件:

  xscan_gui.exe--X-Scan图形界面主程序

  checkhost.dat--插件调度主程序

  update.exe--在线升级主程序

  *.dll--主程序所需动态链接库

  使用说明.txt--X-Scan使用说明

  /dat/language.ini--多语言配置文件,可通过设置“LANGUAGESELECTED”项进行语言切换

  /dat/language.*--多语言数据文件

  /dat/config.ini--当前配置文件,用于保存当前使用的所有设置

  /dat/*.cfg--用户自定义配置文件

  /dat/*.dic--用户名/密码字典文件,用于检测弱口令用户

  /plugins--用于存放所有插件(后缀名为.xpn)

  /scripts--用于存放所有NASL脚本(后缀名为.nasl)

  /scripts/desc--用于存放所有NASL脚本多语言描述(后缀名为.desc)

  /scripts/cache--用于缓存所有NASL脚本信息,以便加快扫描速度(该目录可删除)

 

2准备工作

  X-Scan是完全免费软件,无需注册,无需安装(解压缩即可运行,自动检查并安装WinPCap驱动程序)。

若已经安装的WinPCap驱动程序版本不正确,请通过主窗口菜单的“工具”->“InstallWinPCap”重新安装“WinPCap3.1beta4”或另行安装更高版本。

3图形界面设置项说明

  “检测范围”模块:

  “指定IP范围”-可以输入独立IP地址或域名,也可输入以“-”和“,”分隔的IP范围,如“192.168.0.1-20,192.168.1.10-192.168.1.254”,或类似“192.168.100.1/24”的掩码格式。

  “从文件中获取主机列表”-选中该复选框将从文件中读取待检测主机地址,文件格式应为纯文本,每一行可包含独立IP或域名,也可包含以“-”和“,”分隔的IP范围。

  “全局设置”模块:

  “扫描模块”项-选择本次扫描需要加载的插件。

  “并发扫描”项-设置并发扫描的主机和并发线程数,也可以单独为每个主机的各个插件设置最大线程数。

  “网络设置”项-设置适合的网络适配器,若找不到网络适配器,请重新安装WinPCap3.1beta4以上版本驱动。

  “扫描报告”项-扫描结束后生成的报告文件名,保存在LOG目录下。

扫描报告目前支持TXT、HTML和XML三种格式。

  “其他设置”项:

  “跳过没有响应的主机”-若目标主机不响应ICMPECHO及TCPSYN报文,X-Scan将跳过对该主机的检测。

  “无条件扫描”-如标题所述

  “跳过没有检测到开放端口的主机”-若在用户指定的TCP端口范围内没有发现开放端口,将跳过对该主机的后续检测。

  “使用NMAP判断远程操作系统”-X-Scan使用SNMP、NETBIOS和NMAP综合判断远程操作系统类型,若NMAP频繁出错,可关闭该选项。

  “显示详细信息”-主要用于调试,平时不推荐使用该选项。

  “插件设置”模块:

  该模块包含针对各个插件的单独设置,如“端口扫描”插件的端口范围设置、各弱口令插件的用户名/密码字典设置等。

4、使用X-Scan扫描实验主机一定范围的ip

根据实验主机ip地址,指定一定指定IP范围,比如:

192.168.1.10-192.168.1.254

ip数目不少于100个,对其进行扫描,得到结果,并进行简要的分析。

三、Sniffer软件

1、下载并安装Sniffer软件。

2、运行Sniffer软件,抓包并分析各种应用协议:

Telnet、HTTP、FTP等,尤其是HTTP协议。

首先请同学们根据我们提供的软件包,安装snifferpro4.5。

之后需要重启机子。

运行sniffer,选择你的网卡:

如图:

进入sniffer,定义你的过滤属性,鼠标点击capture->definefilter,然后点击profile,新建一个过滤,如图所示:

然后在你建立的过滤上面设置属性,包括address选项卡上面的地址属性,如图:

其中,station1是你的本地地址,station2是远端地址,中间的Dir表示方向,“->”表示过滤发送的包,“<-”表示过滤接收的包,“<->”表示过滤收发的包。

之后,选择过滤包的协议,同学们可以选择IP,TCP,HTTP,TELNET等。

如图:

然后开始抓包,点击capture->start,或者工具栏上面的按钮。

请注意右下方的抓包数量信息,如图:

之后,停止抓包,并显示抓包信息,如图:

3、使用Sniffer进行TCP/UDP抓包。

根据具体的tcp包,分析其各个字段的含义,加深我们对tcp/ip协议的理解。

3、Superscan

(一)简介

功能强大的端口扫描工具。

1)通过Ping来检验IP是否在线; 

2)IP和域名相互转换; 

3)检验目标计算机提供的服务类别; 

4)检验一定范围目标计算机的是否在线和端口情况;

5)工具自定义列表检验目标计算机是否在线和端口情况; 

6)自定义要检验的端口,并可以保存为端口列表文件; 

7)软件自带一个木马端口列表trojans.lst,通过这个列表我们可以检测目标计算机是否有木马;同时,我们也可以自己定义修改这个木马端口列表。

(二)下载安装

SuperScan的最新版本可以在以下网址下载:

直接解压就可以使用,没有安装程序,是一款绿色软件。

(三)具体使用

在使用软件之前,我们先来看看软件的全貌

(1)Ping功能的使用

Ping主要目的在于检测目标计算机是否在线和通过反应时间判断网络状况。

在【IP】的【Start】填入起始IP,在【Stop】填入结束IP,然后,在【ScanType】选择【Pingonly】,按【Start】就可以检测了。

在以上的设置中,我们可以使用以下按钮达到快捷设置目的:

选择【IgnoreIPzreo】可以屏蔽所有以0结尾的IP;选择【IgnoreIP255】可以屏蔽所有以255结尾的IP;点击【PrevC】可以直接转到前一个C网段;选择【NextC】可以直接转到后一个C网段;选择【1..254】直接选择整个网段。

同样,也可以在【ExtractFromFile】通过域名列表取得IP列表。

在Ping的时候,可以工具网络情况在【Timeout】设置相应的反应时间。

一般采用默认就可以了,而且,SuperScan速度非常快,结果也很准确,一般没有必要改变反应时间设置。

(2)端口检测

端口检测可以取得目标计算机提供的服务,同时,也可以检测目标计算机是否有木马。

现在,我们来看看端口检测的具体使用。

检测目标计算机的所有端口

在【IP】输入起始IP和结束IP,在【ScanType】选择最后一项【AllPortsFrom1to65535】,如果需要返回计算机的主机名,可以选择【ResolveHostnem】,按【Start】开始检测。

(3)检测目标计算机是否被种植木马

在主界面选择【Portlistsetup】,出现端口设置界面,点击【Portlistfiles】的下拉框选择一个叫trojans.lst的端口列表文件(图八),这个文件是软件自带的,提供了常见的木马端口,我们可以使用这个端口列表来检测目标计算机是否被种植木马。

(四)使用Superscan扫描目标计算机的特定端口。

根据实验主机ip地址,指定一定指定IP范围,比如:

192.168.1.10-192.168.1.254,ip数目不少于100个,同时指定一定的端口,比如:

80,21,23,对其进行扫描,得到结果,并进行简要的分析。

 

实验报告一

内容和要求:

1、在VC++6.0中,编译以下源代码,并生成exe文件。

对编译生成的可执行程序利用OllyDbg进行调试,找出覆盖的返回地址,并结合学习的理论知识进行分析,在分析报告中提供需要覆盖的返回地址截图。

#include

#include

#include

voidoverflow(char*buf)

{

chardes[5]="";

strcpy(des,buf);

return;

}

voidmain(intargc,char*argc[])

{

LoadLibrary("user32.dll");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1