之前在 ISCC2013 线上赛的时候,这个溢出题没能做出来,现在正好在学习溢出,想重现下漏洞。
http://www.exploit-db.com/exploits/23944/
exploit-db 上有简略的描述
测试环境:
Mozilla Firefox 17.0.1
Foxit Reader 5.4.3.0920
Foxit Reader 5.4.4.1128
npFoxitReaderPlugin.dll
版本:2.2.1.530
exploit-db 上说,当我们访问 http://192.168.0.1/x.pdf?[A x 1024] 时溢出。
在分析之前先讲些要利用到的原理
1. DEP(数据执行保护, Data Excution Prevention)
DEP 的基本原理是将数据所在内存页面标识为不可执行,当程序溢出成功转入 shellcode 时,程序尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。
DEP 的主要作用是阻止数据页 (如默认的堆页、各种堆栈页以及内存池页)执行代码。根据实现的机制的不同可分为:软件 DEP 和硬件 DEP。
根据 DEP 的启动参数的不同,DEP 工作状态可以分为四种。
(1) Optin: 默认仅将 DEP 保护应用与 Windows 系统组件和服务,对于其他程序不予保护,但用户可以通过应用程序兼容性工具(ACT, Application Compatibility Toolkit)为选定的程序启用 DEP, 在 Vista 下边经过 /NXcompat 选项编译过的程序将自动应用 DEP。 这种模式可以被应用程序动态关闭,它多用于普通用户版的操作系统,如 Windows XP、Windows Vista、Windows7。
(2)Optout:为排除列表程序外的所有程序和服务启用 DEP,用户可以手动在排除列表中指定不启用 DEP 保护的程序和服务。这种模式可以被应用程序动态关闭,它多用于服务器版的操作系统,如 Windows 2003、Windows 2008。
(3)AlwaysOn:对所有进程启用 DEP 的保护,不存在排序列表,这种模式下,DEP 不可以被关闭, 目前只有在64位的操作系统上才工作在AlwaysOn 模式。
(4)AlwaysOff:对所有进程禁用 DEP, 这种模式下,DEP 也不能被动态开启,这种模式下,DEP 也不能动态开启,这种模式一般只有在某种特定场所才使用,如 DEP
干扰到程序的正常运行。
2. 利用Ret2Libc 挑战 DEP
由于 DEP 不允许我们直接到非可执行页面执行指令, 我们就需要在其它可执行的位置找到符合我们要求的指令,以便收回程序的控制权,然后继续下一步操作,具体流程可
看下图所示: