首页
社区
课程
招聘
[原创] KCTF 2019 Q3 第十二题 Writeup by Nu1L
发表于: 2019-9-25 22:05 8529

[原创] KCTF 2019 Q3 第十二题 Writeup by Nu1L

2019-9-25 22:05
8529

这是个V8
FastElement的Fill方法的end和capacity校验被删了...那就是常规的溢出咯
学习一下
https://segmentfault.com/a/1190000008188648
https://bbs.pediy.com/thread-252812.htm

找一波FastElements属性
fast之前应该要先过一个Runtime_ObjectGetOwnPropertyNamesTryFastTryFastArrayFill,主要是后者

审错分支了
JSObject

v8::internal::`anonymous namespace'::ElementsAccessorBase<v8::internal::`anonymous namespace'::FastPackedObjectElementsAccessor,v8::internal::`anonymous namespace'::ElementsKindTraits<(v8::internal::ElementsKind)2>>::Fill断下,发现end已被替换为length,得想个法子把TryFast绕了
[[rsi]+8]能看到a.elements
有个想法,可以整一个回调函数,length先改大,在执行fill的时候跑个回调把length变小,这样end就溢出了

高仿一份v8的exp,学习了一下exp中回调函数的用法
https://www.exploit-db.com/raw/46748

可以改valueOf方法
然后整出一个PoC,这里的global用来做后面oob的持续化(之后的oob全靠global这个FastDoubleElements)

获取end时调用valueOf,valueOf的callback去修改arr.length为0x20,然后start = 0x2f end = 0x30 下标溢出

调一下

Sakura大佬先知里发过的工具类(轮子)

任意地址读
改下一个FastDoubleArray的elements指针,然后整一个read64原语

EXP
修改ArrayBuffer的backing-store为rwx_page_addr,然后把Float64给set进去,篡改wasm,成了

交的时候居然还要压缩成一行


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
2
压缩成一行没办法呀,其他形式的环境配置太麻烦了,只有直接拿xinetd socat个d8最简单。。。
最后于 2019-9-26 19:41 被holing编辑 ,原因:
2019-9-26 19:40
0
游客
登录 | 注册 方可回帖
返回
//