返回介绍

介绍

发布于 2025-01-03 23:32:55 字数 1078 浏览 0 评论 0 收藏 0

我想这个话题需要一些介绍,否则你会发现我们即将遇到的大部分障碍都不怎么熟悉。我不会非常详细的展开,因为那太过于耗时了。如果你对这里的一些话题不是很熟悉的话,我建议你先阅读本系列的第 7 部分(ROP)和第 8 部分(堆喷射[第一章:Vanilla EIP])以及上面的阅读材料。

在我们讨论 UAF 之前我们需要先理解虚表(vtable)是什么。C++语言允许基类去定义虚函数。而对于子类来说,它们可以重新去定义这些虚函数的实现体留为己用。也就是说虚函数允许子类去替换基类所提供的实现体。编译器确保被替换的函数永远会被调用,只要该对象实际上是一个子类的话。这些都发生在运行时。

译者注:这里实际上说的不是太理想,虚函数就是子类可以重新定义实现体,且会取代父类提供的实现体。C++用此实现多态,即运行时动态绑定。而所谓多态,简单理解就是——当用父类指针指向子类对象时,一旦调用到虚函数,最后执行的会是子类定义的那个实现体,即作者所说的那个 replacement。

虚表保存了基类中定义的各种虚函数实现体的指针。当一个函数在运行时需要被调用时,合适的指针会从对应的子类虚表中选择出来。我们可以看这样一张表示图。

UAF 漏洞往往较为复杂,引发的问题也变化多端。通常执行流会像这样:

  1. 在某个点上一个对象被创建并与一个虚表相关联。
  2. 此后对象由一个虚表指针所调用。如果我们在调用前释放了该对象那么程序会在后面调用该对象时崩溃(eg: 在释放后尝试重用对象——UAF)。

想要利用这个议题我们将通常执行这些操作:

  1. 在某个点一个对象被创建
  2. 触发该对象的释放操作
  3. 我们创建自己的对象,它的尺寸尽可能的和原始对象相仿
  4. 此后当虚表指针被调用时,我们的伪造对象就被用到并得以执行代码

通常这些听起来贼复杂,但是随着我们示例的展开,一切都会渐渐清晰。首先我们创建一个可信的堆喷射,此后我们再聚焦于 MS13-009!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文