[翻译]返回导向编程实例入门
返回导向编程实例入门
我在伯克利大学的计算机安全课上接触了基础的栈溢出利用(具体题目在这)。有栈溢出漏洞的程序名为dejavu,它的代码如下:
void deja_vu() {
char door[8];
gets(door);
}
int main() {
deja_vu();
}
题目仅要求在不启用ASLR(地址空间配置随机加载),DEP(数据执行保护)和Stack Canaries(通过监测一个放置于栈缓冲区后的随机值是否被修改来判定栈是否出现了溢出)这几个常见的溢出保护措施的情况下利用这个漏洞,这自然不难做到,但如果我们启用了它们又该如何成功呢?我将展示如何使用一个ROP(返回导向编程)链来击败这些保护措施。
绕过 ASLR 和 DEP
我们先来对付ASLR和DEP。因为dejavu并未使用PIE保护 (位置独立的可执行程序),它的.text segment并不会在内存中被随机加载。这种情况下我们可以通过使用ROP链来同时绕过ASLR和DEP。步骤如下:
- 把libc库中的system函数的地址放在栈上。
- 把字符串"s/kernel/rtsig-max"的地址放在栈上 。
- 让栈指针esp指向"s/kernel/rtsig-max"。
- 让edx指向&system。
- 执行call [edx]。
这等同于执行system("s/kernel/rtsig-max"),也就是说dejavu会用setuid权限运行位于s/kernel/rtsig-max相对路径的文件。我们只需把自己的代码放在s/kernel/rtsig-max,然后通过执行system函数来调用它就能运行了。"s/kernel/rtsig-max"这个字符串是我随便挑选的;任和存在于libc里可被判定为相对路径的字符串都可以被选用。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
