第二章------关于被入侵
简单说明:
经常有帖子说:“我中木马啦,怎么办?”、“我被攻击了”,“我的windows有问题,是不是被入侵啦?”等等。哪么如果你怀疑系统被入侵的话,请你首先看看日志的记录或是有什么变化,然后你应该查看可疑进程(win98需要用相关工具)、注册表启动项、服务、开放端口等,然后更新病毒库,杀毒。前提是你要有一定的电脑常识并对你的系统比较了解,才能分别正常与否。如果你自己对电脑一窍不通,那在论坛别人也很难帮助你。其实就像对付现实中的病毒一样,应该预防为主。杀毒软件和网络防火墙可以抵御绝大部分危险,自身安全知识的提高则是最根本的保障。最新的病毒相关知识可以到杀毒软件公司的主页上找。另外,系统不正常也可能是操作失误引起的。这里不是“电脑零起点”,所以关于系统修复的问题,请不要在论坛提了。
相关工具:
相关资料:
第三章------基础知识和入侵步骤
第四章------关于命令的使用
简单说明:
windowsNT/2000下有丰富的cmd可供使用,其作用也是巨大的。完全值得去熟练掌握她它们。windows2000本身就提供了详细的命令帮助。在开始菜单--》帮助中可以搜索到“windows 2000 命令参考”。强烈建议各位新手花些时间仔细看一遍。装了比如IIS等软件,就会有新的命令(iisreset),在命令行方式下加/?或-h参数可以查看帮助,其他内置的命令当然也可以。还有就是掌握一些常用的DOS命令也是非常有必要的。因为WINSOWS不管发展到哪一天,它也都不可能取代DOS,至少现在还不行。NET命令更是最常用的网络命令,想做一个**,更是你所必需掌握的。掌握一些LINUX命令也是很有必要的。希望下面的资料对大家有所帮助。
第五章------关于windows98
简单说明:
这类问题有两种:一是怎样入侵win98系统,二是在win98怎样入侵。
由于98的网络功能并不完善,使得问题的解决远没有像对2000那样“丰富多采”。98默认没有什么网络服务启动,众所周知漏洞是由于各种服务的功能设计并不完美,所以才产生的,也就是说没有漏洞也就很难入侵,找不到什么可利用的漏洞。这给入侵带来的困难是难以想像的.共享入侵,算是最常见的攻击方式了。
其实还有些方法,比如嗅探密码、发病毒和木马到信箱、甚至用QQ“联络感情”再传个绑木马的Flash等,没什么意思,就此打住(这是前辈说的,他老人家都说打住了,哪我也打住,其实是我也不知道说什么,呵呵)。
基于同样的理由,98不是一个好的攻击平台。如果只是端口扫描,那么superscan可以胜任。web类的漏洞扫描x-scan也可以。但涉及ipc$的弱口令、漏洞、远程控制工具以及连接一些服务(如sql)就要“基于NT技术构建”的os了。好在3389终端服务的客户端可以是98,所以先搞一台开3389的*就算是回避了问题。如果你还在用98,诚恳的建议你:请用2000。如果你在网吧,先试试入侵网吧服务器。
----------------------------------------------
第六章------关于破解邮箱
简单说明:
现在破解邮箱的贴子以经不是很多,至少比前半年少了很多了,但是还是有,所以就给出下面一点资料,希望能帮到大家。偷看别人信件是违法行为,请不要偷看他人信件,如果想掌握技术的话,哪你可以自己解自己的邮箱,这样既掌握了技术,又不会有人找你麻烦。
第七章------关于解除网吧、网页限制
简单说明:
现在关于网吧破解,网页限制破解的贴子正好和破解邮箱的相反,越来越多,各种管理软件也是层出不穷,可是自古以来就是道高一尺,魔高一丈,下面的资料供大家参考吧。记住不要太过份:
第八章------关于流光
常见问题回答:
1,我下载的流光杀毒软件说有病毒,怎么会事?
答:一些杀毒软件的确认为流光是木马(谁让它这么有名呢,呵呵)。如果杀毒,流光将无法使用,所以只有让杀毒软件停止监测。必竟要得到一些东西的时候你就要做好准备失去一去些什么。呵呵,不过没关系的,它不会对你的系统构成任何威胁。
2,为什么有些*安装sensor失败?
答:如果拷贝文件出错,可能是因为目标admin$共享未开放。请采用其他shell,在目标主机上执行net share admin$命令。
如果启动服务失败,可能因为使用的端口已经被占用,换个试试;也可能目标有杀毒软件删除了文件,或者有防火墙阻止sensor连网,没有什么好的解决办法。
3,为什么一些流光扫到的密码不能用?
答:可能是误报,将扫描速度降低些再扫。对于winxp目标,也会产生误报。也可能因为你用扫到的非管理员帐号来连接目标,请在ipc$扫描选项里将“只对administrators组进行猜解”选上。(以上一段基本全部都是前辈说的话,没做改动。)
----------------------------------------------
第九章------关于字典
简单说明:
操作系统将用户和密码信息加密后存放在特定的地方和文件中。典型的如windowsNT里的sam文件和Linux里的etc/passwd。由于加密算法是单向散列的,所以几乎不可能找到逆向算法。因此,不得不使用同样的算法加密各种口令,将结果去吻合散列值。字典就是有选择地储存了一批口令的文件。例如生日、常用单词、中文名字的拼音等。著名的破解密码的工具,一般自带一些字典。也可以使用字典工具制作符合要求的字典。
简单说明:
******首先需要指出的是空连接和ipc$是不同的概念。空连接是在没有信任的情况下与服务器建立的会话,换句话说,它是一个到服务器的匿名访问。ipc$是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限。有许多的工具必须用到ipc$。默认共享是为了方便远程管理而开放的共享,包含了所有的逻辑盘(c$,d$,e$……)和系统目录winnt或windows(admin$)。******个人认为这段很重要,因为很多人根本就不知道什么是空连接什么是IPC$.建议不知道的朋友仔细看一下吧.
常见问题和回答:
一、怎样建立空连接,它有什么用?
答:使用命令 net use
\\IP\ipc$ "" /user:"" 就可以简单地和目标建立一个空连接(需要目标开放ipc$)。
对于NT,在默认安全设置下,借助空连接可以列举目标用户、共享,访问everyone权限的共享,访问小部分注册表等,没有什么利用价值。对2000作用就更小了。而且实现也不方便,需借助工具。如果你不理解“没用”的东西为什么还会存在,就看看“专业”的解释吧:
在NT/2000下的空连接
http://www.sixthroom.com/ailan/f ;... 2&RootID=280&ID=280
解剖WIN2K下的空会话
http://www.sixthroom.com/ailan/f ;... 2&RootID=283&ID=283
二、为什么我连不上IPC$?
答:1,只有nt/2000/xp及以上系统才可以建立ipc$。如果你用的是98/me是没有该功能的。
2、确认你的命令没有打错。正确的命令是: net use \\目标IP\ipc$ "密码" /user:"用户名"
注意别多了或少了空格。当用户名和密码中不包含空格时两边的双引号可以省略。空密码用""表示。
3,根据返回的错误号分析原因:
错误号5,拒绝访问 : 很可能你使用的用户不是管理员权限的,先提升权限;
错误号51,Windows 无法找到网络路径 : 网络有问题;
错误号53,找不到网络路径 : ip地址错误;目标未开机;目标lanmanserver服务未启动;目标有防火墙(端口过滤);
错误号67,找不到网络名 : 你的lanmanworkstation服务未启动;目标删除了ipc$;
错误号1219,提供的凭据与已存在的凭据集冲突 : 你已经和对方建立了一个ipc$,请删除再连。
错误号1326,未知的用户名或错误密码 : 原因很明显了;
错误号1792,试图登录,但是网络登录服务没有启动:目标NetLogon服务未启动。(连接域控会出现此情况)
错误号2242,此用户的密码已经过期 : 目标有帐号策略,强制定期要求更改密码。
4,关于ipc$连不上的问题比较复杂,本论坛没有总结出一个统一的认识,我在*上实验有时会得出矛盾的结论,十分棘手。而且知道了问题所在,如果没有用其他办法获得shell,很多问题依然不能解决。问题过于细致后就不适合在本文章里探讨了。各位看着办吧,呵呵。
三、怎样打开目标的IPC$?
答:首先你需要获得一个不依赖于ipc$的shell,比如sql的cmd扩展、telnet、木马。当然,这shell必须是admin权限的。然后你可以使用shell执行命令 net share ipc$ 来开放目标的ipc$。从上一问题可以知道,ipc$能否使用还有很多条件。请确认相关服务都已运行,没有就启动它(不知道怎么做的请看net命令的用法)。还是不行的话(比如有防火墙,杀不了)建议放弃。
四、怎样映射和访问默认共享?
答:使用命令net use z: \\目标IP\c$ 密码" /user:"用户名" 将对方的c盘映射为自己的z盘,其他盘类推。
如果已经和目标建立了ipc$,则可以直接用IP加盘符加$访问。比如 copy muma.exe
\\IP\d$\path\muma.exe 。或者再映射也可以,只是不用用户名和密码了:net use y:
\\IP\d$ 。然后 copy muma.exe y:\path\muma.exe 。当路径中包含空格时,须用""将路径全引住。
五、如何删除映射和ipc$连接?
答:用命令 net use
\\IP\ipc$ /del 删除和一个目标的ipc$连接。
用命令 net use z: /del 删除映射的z盘,其他盘类推。
用命令 net use * /del 删除全部。会有提示要求按y确认。
六、连上ipc$然后我能做什么?
答:能使用管理员权限的帐号成功和目标连接ipc$,表示你可以和对方系统做深入“交流”了。你可以使用各种命令行方式的工具(比如pstools系列、Win2000SrvReskit、telnethack等)获得目标信息、管理目标的进程和服务等。如果目标开放了默认共享(没开你就帮他开),你就可以上传木马并运行。也可以用tftp、ftp的办法上传。像dwrcc、VNC、RemoteAdmin等工具(木马)还具有直接控屏的功能。如果是2000server,还可以考虑开启终端服务方便控制。这里提到的工具的使用,请看自带的说明或相关教程。
七、怎样防止别人用ips$和默认共享入侵我?
答:A、一种办法是把ipc$和默认共享都删除了。但重起后还会有。这就需要改注册表。
1,先把已有的删除
net share ipc$ /del
net share admin$ /del
net share c$ /del
…………(有几个删几个)
2,禁止建立空连接
首先运行regedit,找到如下主键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA]把RestrictAnonymous(DWORD)的键值改为:00000001。
3,禁止自动打开默认共享
对于server版,找到如下主键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]把AutoShareServer(DWORD)的键值改为:00000000。
对于pro版,则是[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]把AutoShareWks(DWORD)的键值改为:00000000。
B、另一种是关闭ipc$和默认共享依赖的服务(不推荐)
net stop lanmanserver
可能会有提示说,XXX服务也会关闭是否继续。因为还有些次要的服务依赖于lanmanserver。一般情况按y继续就可以了。
C、最简单的办法是设置复杂密码,防止通过ipc$穷举密码。但如果你有其他漏洞,ipc$将为进一步入侵提供方便。
D、还有一个办法就是装防火墙,或者端口过滤。防火墙的方法就不说了,端口过滤看这里:
过配置本地策略来禁止139/445端口的连接:
http://www.sixthroom.com/ailan/f ;... 2&RootID=284&ID=284
以上问题部份基本未做修改。原因很简单应该说的,和能想到的,前辈都写出来了。
第十一章------关于扫描出的漏洞
简单说明:
很多扫描器都有漏洞扫描功能。当你获得了一些主机的漏洞列表时,不要急着把它们帖在论坛上,期望别人来为你分析和告诉你利用的方法。你应该首先尝试自己完成这些。扫描出的漏洞并不是都有用的,一部分漏洞过时了,一部分是误报。如果你希望了解的多一些,最好经常到发布漏洞比较快的网站走一走,漏洞的利用是一个不段积累的过程。时间长了相信你就体会到了。
漏洞搜索:
第十二章------关于提升权限
简单说明:
**的最终目标就是得到root(即win中的admin)权限。一个真正的**会把一次入侵当做是自己的一件作品,不会轻易放弃,但是有些漏洞(典型的如Unicode漏洞、ASP木马)不能直接获得管理员权限,所以必然需要提升权限。一些新手可能会犯这类错误,以为中了木马、获得了shell就能控制一切。结果就出现“为何不能加用户”、“为何不能开3389”等问题。2000及更高版本os承袭了NT的安全结构,多重机制环环相扣来保障安全,特别是帐户安全。无奈安全系统过于庞大,多少会出现漏洞,于是我们就有机会了。 还要补充一点,就是在拿到一个现成的后门软件,或是一个木马的时候,一定要先看看说明。至少你应该知道这个后门运行后的效果吧?更有些人上传了某个后门软件或是木马到目标后就认为完事了,你不执行它就是传个地雷上去又有什么用呢?
第十三章------关于做代理和跳板
简单介绍:
代理服务器英文全称是Proxy Cerver,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。更重要的是:Proxy Server (代理服务器)是 Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联 (OSI) 模型的对话层,有了对代理的了解,相信你也认识到了什么是跳板。
第十四章------关于终端服务(3389)
简单说明:
windows终端服务提供了通过作为终端仿真器工作的“瘦客户机”软件远程访问服务器桌面的能力。图形界面和不影响当前本地用户的特性是它的最大优点。由于它是2000server及以上版本自带的功能,因此成为一个绝好的“后门”而倍受青睐。而且win98也可以成为客户端,这使得在网吧“工作”成为可能。有一点需要强调一下使用客户端登陆远程主机对当前工作的用户没有影响,而且一切动作本地用户都是看不到的。也就是说远程登陆和本地用户是在不相同的空间,两者互不干扰。
第十五章------关于克隆帐号
简单说明:
克隆帐号的原理简单的说是这样:在注册表中有两处保存了帐号的SID相对标志符,一处是SAM\Domains\Account\Users下的子键名,另一处是该子键的子项F的值中。这里微软犯了个不同步它们的错误,登陆时用的是后者,查询时用前者。当用admin的F项覆盖其他帐号的F项后,就造成了帐号是管理员权限但查询还是原来状态的情况。即所谓的克隆帐号。(前辈就是前辈把大家想到的都写出来了,我实在不知道这里在加些什么了。看来也只有这样了。大家如果还有什么不明白的就到论坛里发贴子吧。
具体的看这里:
解剖安全帐号管理器(SAM)结构
http://www.sixthroom.com/ailan/f ;... 3&RootID=387&ID=387
明白原理后就可以手动或者用现成的工具克隆帐号了。
常见问题和回答:
1,使用ca时,出现connect **.**.**.** ...Error是怎么会事?
答:ca和cca需要目标开放ipc$,请确认可以与目标建立ipc$。参见“关于ipc$和空连接”
2,使用ca时,出现“Processing....ERROR”是怎么会事?
答:这说明对方主机缺少文件msvcp60.dll,想办法传个过去放在系统目录下就可以了。
3,克隆过程没有错误,但cca没有显示该帐号克隆成功,无法使用被克隆的帐号。
答:这一般是因为对方主机是域控制器,注册表中sam结构不同,工具失效。暂时无法解决。
4,手动克隆无法访问注册表SAM键怎么办?
答:在命令行方式,可以使用psu工具获得SYSTEM权限,从而访问SAM键。详见上面说明。
在图形界面,运行regedt32.exe,找到SAM键并选中。“安全”子菜单栏里有一项“权限”,打开它。在里面设置administrator和SYSTEM一样有完全控制权限。关闭regedt32再打开,就可以访问SAM键了。
第十六章------关于日志
简单说明:
日志是系统自动根据你个人的设置所记载的所定义配置中的活动情况及基本资料,这对一个管理员来说是很重要的,管理员可以根据日志发现系统的异常情况,并且及时做出处理.相反对于一个**来说,这也是至关重要的,因为操作系统的许多服务都带日志。最重要和明显的就是IIS和事件日志。它们最有可能记录你的IP和行动。而且相对于其他的如ftp、计划任务、telnet的日志更为管理员重视。另外,如果你获得了图形界面的shell来用IE,还可能会留cookie,而这些东西对于你来说,都是至命的.消灭它没商量.^_^
第十七章------关于后门和木马
简单说明:
后门一般是指一个系统或是应用软件存在的一些设计缺陷,或是设计人员为了方便解决问题而特别留下的后门,总之无论怎么样?如果后门被其他人知道,或是在发布软件之前没有删除后门,那么它就成了安全风险。还有一种就是攻击者留下为了方便以后进入而留下的.木马其实也属于后门的一种.
第十八章------关于打补丁
简单说明:
如果你发现*有漏洞的话,一般可以用上面提到的漏洞搜索引擎找到相应的补丁下载URL。大的补丁比如sp2就找微软要吧(特别推荐windows update,可以使用WEB方式的搜索功能,查看到你现在有哪些补丁没有下安装,以免因为系统漏洞给你或你的公司带来不必要的损失。在攻击别人之前自己的安全一定要做好,否则,呵呵,你就哭去吧)。
第十九章------关于telnet
简单说明:
telnet是一种命令行方式的终端服务,其优势在于客户端和服务端都是系统自带的。它是除了木马外,获得cmd下shell的最好选择。使用该服务时,最常遇到的问题就是NTLM认证方式。当NTLM=2时,要求你必须使用你系统当前的帐户和密码登陆;当NTLM=0时直接要求你输入帐户及密码进行验证;NTLM=1则是前一种要求失败后再用后一种。由于系统默认的NTLM为2,所以想用你得到的帐户登陆,要么在自己系统上也建立一个用户名密码都一样的帐户,要么想办法更改对方的NTLM。(TELNET我个人非常喜欢,原因很简单,他是系统本身自带的,100%不会出现被查杀的情况)TELNET使用方法很简单直接在CMD下键入telnet remote-computer-name(or IP)既可。
第二十章------关于ftp入侵
简单说明:
FTP是英文File Transfer Protocol(文件传输协议)的缩写。顾名思义,FTP就是专门用来传输文件的协议,也就是说通过FTP我们可以在Internet网上的任意两台计算机间互传文件。
一些人容易将FTP与Telnet混淆,而实际上Telnet是将用户的计算机当成远端计算机的一台终端,用户在完成远程登陆后,具有远端计算机上的本地用户一样的权限。而FTP没有给予用户这种地位,它只允许用户对远方计算机上的文件进行有限的操作,包括查看文件、交换文件以及改变文件目录等。
即使得到上传权限也无法直接执行程序,利用办法可以参考win98共享的入侵。一些较早版本的ftp服务软件,尤其是UNIX平台上的,有溢出或越权访问的漏洞,相关信息请查看后面关于漏洞的部分。
第二十一章------关于sql
简单说明:
SQL是Structured Query Language(结构化查询语言)的缩写,它是目前使用最广泛的数据库语言,SQL是由IBM发展起来的,后来被许多数据库软件公司接受而成为了业内的一个标准。
就象SQL的名字一样,我们可以通过容易理解的查询语言,来和数据库打交道,从数据库中得到我们想要的数据。对于SQL语言,有两个组成部分:
DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。
DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
了解这两个部分的不同对于你今后使用时有很多方便,因为许多SQL语言中的约束也是根据这个分类来划分的,SQL作为一个ANSI标准,一直在不断改进。以下的讨论都是针对它的。由于具有管理员权限的帐号sa默认密码为空,且低版本的sql有漏洞能直接获得密码。因此它也成为入侵的一种捷径(如果存在漏洞的话)。用客户端工具连接后直接当cmd用吧。
第二十二章------关于sniffer
简单说明:
Sniffer既可以是硬件,也可以是软件,它用来接收在网络上传输的信息。网络可以是运行在各种协议之下的。包括Ethernet、TCP/IP、ZPX等等(也可以是其中几种协议的联合)。放置Sniffer的目的是使网络接口(在这个例子中是以太网适配器)处于广播状态(promiscuous mode),从而可从截获网络上的内容。
第二十三章------关于DoS和DDos
简单说明:
拒绝服务攻击只在很特殊的情况才有应用价值。它完全是一种破坏和令人厌恶的行为。因此十分不推荐新手尝试。各位了解一下它的原理就可以了。这种攻击破坏性极大,而且很难避免。希望大家不要拿来做坏事,更不要对国内的网络进行试验。要试就找个日本,美国的试去。最好的办法还是你自己卖两台机器,做这台前面攻击哪台,呵呵,可是要有¥¥¥呀。哈哈。
第二十四章------关于UNIX/Linux
简单说明:
UNIX/Linux无疑是比windows更历史悠久更出色的OS。可惜缺少了一些“平易近人”,让许多人望而却步。这里也不打算讲些什么,想学它的人不如从学习怎么找相关资料开始吧,呵呵。不过还是建议初学者从WINDOWS入手比较好一些,而且按市占有率看,也应该多接触WINDOWS系统。当然抽空熟悉一下U系统也是不错的选择,这里简单介绍大家一点资料。
第二十五章------溢出
简单说明:
溢出对我们这些小鸟们属于比较高级的玩意了。所以在这里也不准备多提,否则就违反了这篇文章写给初学者的初衷了。
缓冲区溢出
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。
缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:?/P>
example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
-----------------------------------------------------------
上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。在C语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈段的。缓冲区溢出是利用堆栈段的溢出的。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置如下:
/――――――――\ 内存低端
|程序段|
|―――――――――|
|数据段|
|―――――――――|
|堆栈|
\―――――――――/内存高端
堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。在高级语言中,程序函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值是也用到了堆栈。通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。另外还有一个基址指针(FP,在Intel芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。通常,参数的相对FP的偏移是正的,局部变量是负的。当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容,做为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。
下面举个例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
-----------------------------------------------------------
为了理解程序是怎样调用函数function()的,使用-S选项,在Linux下,用gcc进行编译,产生汇编代码输出:
$ gcc -S -o example1.s example1.c
看看输出文件中调用函数的那部分:
pushl $3
pushl $2
pushl $1
call function
这就将3个参数压到堆栈里了,并调用function()。指令call会将指令指针IP压入堆栈。在返回时,RET要用到这个保存的IP。在函数中,第一要做的事是进行一些必要的处理。每个函数都必须有这些过程:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
这几条指令将EBP,基址指针放入堆栈。然后将当前SP拷贝到EBP。然后,为本地变量分配空间,并将它们的大小从SP里减掉。由于内存分配是以字为单位的,因此,这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20。这样,现在,堆栈看起来应该是这样的。
低端内存高端内存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
栈顶栈底
缓冲区溢出就是在一个缓冲区里写入过多的数据。那怎样利用呢,看
一下下面程序:
example2.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
void main() {
char large_string[256];
int i;
for( i = 0; i < 255; i++)
large_string = A;
function(large_string);
}
------------------------------------------------------------
这个程序是一个经典的缓冲区溢出编码错误。函数将一个字符串不经过边界检查,拷贝到另一内存区域。当调用函数function()时,堆栈如下:
低内存端buffer sfp ret *str高内存端
< ------ [ ][ ][ ][ ]
栈顶栈底
很明显,程序执行的结果是"Segmentation fault (core dumped)"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容A覆盖,包括sfp, ret,甚至*str。A的十六进值为0x41,所以函数的返回地址变成了0x41414141, 这超出了程序的地址空间,所以出现段错误。可见,缓冲区溢出允许我们改变一个函数的返回地址。通过这种方式,可以改变程序的执行顺序。
由于是简单介绍给大家熟悉一下,所以在这里不给出软件了,如果大家有需要的话,可以在附录中找到。
第二十六章------OICQ
简单介绍
关于QQ我不想说什么了,一种既时通讯软件,上网的人都知道。现在常见的问题,无非就是谁能给我个QQ?谁能帮我偷个QQ?我的QQ了,谁能帮我偷回来?怎样偷QQ?个人认为偷QQ这种事,是对**精神的一种侮辱,请不要在问这种问题,更不要问我这种问题,因为我对偷QQ的事特别讨厌。如果你的号码真的被偷了,哪也只能说明你没安全意识,你可以试试下面给出的地址,时间可能会慢一点,不过也只有等了,如果实在找不回来,哪也只能当做一个教训了。下次注意吧。必竟黑过来黑回去的没什么意思,好了,下面的地址是腾讯的服务区,有事就到哪里去吧:
附录
关于常用工具的使用
简单说明:
**的工具就像战士的枪,一定要熟练掌握灵活应用。这里给出一些常用的工具方便新手下载。其他工具还是自己搜一下吧。一般命令行下的工具是自带简单的使用说明(即usage)的,当输入错误参数或不输参数就会显示。不要因为帮助是英文的就放弃学习。给出的软件使用教程,总会有没讲到或讲的不够细致的地方。遇到问题请首先尝试自己解决。实在不行的话,就请把握住问题的要点,清楚地表达出来。补充一般命令行下的软件直接打这个软件名,不加任何参数(还有一部份加/?)就会显示软件帮助及参数的。