在 openECSC 中利用 V8

这是一篇关于在 V8 JavaScript 引擎中利用内存损坏漏洞获取/bin/sh shell 的博客文章,主要内容如下:

  • 挑战背景:openECSC CTF 中的Baby array.xor挑战,目标是从 V8 漏洞中获取/bin/sh shell,大多数 V8 漏洞利用分为两个阶段,此挑战也不例外。
  • 寻找内存损坏:挑战通过添加Array.xor()原型来异或双精度浮点数数组中的所有值。通过各种技巧,如使用代理和绕过检查,最终成功将对象放入数组中并修改其指针。
  • 突破边界:通过d8 natives syntaxgdb调试,了解 V8 在内存中的存储方式,包括数组的地址、元素的存储等。尝试创建新数组并通过异或操作使其指向其他位置。
  • 炮制原始类型:在 JavaScript 利用中,将内存损坏转化为addroffakeobj原始类型,编写相关函数来获取和设置对象的地址,并实现读取和写入内存的功能。
  • 代码执行:研究代码存储和运行的方式,通过%PrepareFunctionForOptimization()%OptimizeFunctionOnNextCall()使 V8 优化代码,尝试通过创建包含特定字节码的函数来实现代码执行,但遇到权限错误。借鉴 Anvbis 的方法,创建包含特殊字节码的函数,并成功重定向执行到特定位置。
  • 避免垃圾回收:发现依赖调试函数进行代码优化不可行,尝试通过多次运行函数来让 V8 自动优化代码,遇到垃圾回收导致原始类型失效的问题。最终使用 Maglev 代替 Turbofan 完成代码优化,并得到最终的利用代码。
  • 原本可以改进的地方:介绍了一些可以改进利用代码的方法,如obj2ptr函数用于获取数组地址,改变数组长度以获取越界读取/写入等。还提到了其他人使用 wasm rwx 路线进行代码执行的方法。
  • 后记:感谢查看博客,介绍了页面的制作和兼容性等信息,并提供了讨论帖子的链接。

总的来说,文章详细记录了作者在 openECSC CTF 中利用 V8 漏洞的过程和经验,包括各种技术细节和遇到的问题及解决方法。

阅读 10
0 条评论