我已阅读并完成了Reversing: Secrets of Reverse Engineering和Hacking: The Art of Exploitation。它们都以自己的方式发光,但我仍然觉得它们中的很多技术和信息在某种程度上已经过时了。
当臭名昭着的Phrack文章Smashing the Stack for Fun and Profit写于1996年时,就在我考虑计算机安全“黄金时代”之前。
在随后的几年中编写漏洞相对容易。 C和汇编中的一些基本知识是执行缓冲区溢出和在受害者机器上执行某些任意shell代码所需的全部内容。
说实话,事情已经很多更加复杂。现在,安全工程师必须应对Address Space Layout Randomization (ASLR),Data Execution Prevention (DEP),Stack Cookies,堆Cookie等内容。写作漏洞的复杂性至少上升了一个数量级。
你不能在今天发现的教程中运行大多数缓冲区溢出漏洞事件而不用一堆标志来编译来关闭现代保护。
现在,如果你想编写一个漏洞,你必须设计出关闭DEP的方法,用你的shell代码喷洒数百次,然后尝试猜测shellcode附近的随机内存位置。更不用说当今使用的托管语言普遍存在,这些漏洞在这些漏洞方面更加安全。
我希望将我的安全知识扩展到为十年之久的系统编写玩具漏洞。我无法找到资源来帮助解决面对我在上面概述的所有保护措施时编写漏洞利用的问题。
哪些更先进和最流行的论文,书籍或其他资源致力于应对为现代系统编写漏洞的挑战?
答案 0 :(得分:6)
你提到'粉碎堆栈'。研究方面,这篇文章在它发表之前已经过时了。 80年代后期的莫里斯蠕虫使用它(利用指纹IIRC)。当时它引起了巨大的轰动,因为当时每台服务器都是用乐观的C语言编写的。
花了几年(大约10年),但渐渐地每个人都变得更加关注与面向公众的服务器相关的安全问题。
用C语言编写的服务器经过大量安全分析,同时服务器端处理扩展到其他语言和运行时。
今天事情看起来有点不同。服务器不被视为重要目标。这些天它的客户是大鱼。劫持客户端,服务器将允许您在该客户端的凭据下运行。
景观发生了变化。
就个人而言,我是组装游戏的零星粉丝。我对它们没有实际用处,但是如果你想了解它,我建议你查看Metasploit源代码并阅读他们的邮件列表。他们做了很多疯狂的事情,并且全部在公开场合。
答案 1 :(得分:2)
我印象深刻,你是个黑客杰克Like me。您需要转移到Web应用程序。过去几年发布的大多数CVE编号都在Web应用程序中。
阅读这两篇论文:
http://www.securereality.com.au/studyinscarlet.txt
http://www.ngssoftware.com/papers/HackproofingMySQL.pdf
获取LAMP堆栈并安装这三个应用程序:
http://sourceforge.net/projects/dvwa/(php)
http://sourceforge.net/projects/gsblogger/(php)
http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project(j2ee)
您应该下载w3af并掌握它。为它编写插件。 w3af是一个非常棒的攻击平台,但是它有问题并且在DVWA方面存在问题,它会破坏灰度。 Acunetix是一款优秀的商用扫描仪,但价格昂贵。
答案 2 :(得分:1)
我强烈推荐“The Shellcoder's Handbook”。在编写漏洞利用时,这是我读过的最好的参考资料。
如果您有兴趣编写漏洞,那么您可能需要学习如何进行逆向工程。对于99%的世界,这意味着IDA Pro。根据我的经验,没有比Chris Eagle的“The IDA Pro Book”更好的IDA Pro书。他详细介绍了您在IDA Pro中需要做的所有事情。
OpenRCE.org上有一个非常棒的逆向工程社区。那里有大量的论文和各种有用的应用程序。我在一个名为RECon的两年一度的逆向工程会议上了解到了这个网站。下一次活动将在2010年举行。
这些天的大多数研究都将是“低调的结果”。我最近在安全会议上进行的大多数谈话都涉及移动平台(iPhone,Android等)上的漏洞,现有操作系统上几乎没有任何保护措施。
一般来说,没有一个参考文献可以解释如何编写现代漏洞,因为操作系统内置了大量的保护措施。例如,假设您发现了一个堆漏洞,但Windows中令人讨厌的新安全取消关联功能可以阻止您获得执行。您必须知道两位天才研究了此功能并found a flaw。
祝你学习顺利。利用写作非常令人沮丧,而且极其有益!呸!垃圾邮件让我无法发布所有链接。遗憾!
答案 3 :(得分:1)
例如,在正常的漏洞利用中,您可能会溢出堆栈,然后使用NOP Sled,Shellcode或包含shellcode的环境变量的地址来控制返回地址(EIP)。在不允许堆栈可执行的系统上尝试此漏洞利用时,您的代码将无法运行。相反,当您溢出返回地址(EIP)时,您可以将其指向内存中的现有函数,例如system()或execv()。您预先使用此函数所需的参数填充所需的寄存器,现在您可以调用/ bin / sh而无需从堆栈中执行任何操作。
有关详细信息,请查看此处: