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