记录下当时很简单的一题v8
题目描述
Enviroment: Ubuntu18.04
Update: If you want to build one for debugging, pleasegit checkout f7a1932ef928c190de32dd78246f75bd4ca8778b
查看diff文件
这里直接看注释就能理解,一个是不需要--allow-native-syntax
flag 我们就能直接调用%ArrayBufferDetach
,第二个是我们只能调用%ArrayBufferDetach
,%DebugPrint
这个就变成了Undefined
了
1 | diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
测试下看看:
1 | ruan@ubuntu ~/chrome_challenge/tctf2020_chromium_rce/tctf ./d8 --allow-natives-syntax |
这个patch搜索了一番,应该是禁用了wasm的利用方法:
1 | diff --git a/src/d8/d8.cc b/src/d8/d8.cc |
这里的diff应该是让TypedArray.prototype.set()
能作用于一个DetachedBuffer
上:
1 | diff --git a/src/builtins/typed-array-set.tq b/src/builtins/typed-array-set.tq |
poc如下:
1 | var buffer1 = new ArrayBuffer(0x100); |
效果:
我自己编译了一个debug版本的d8,而且把最后两个diff给去掉了,这样就能用%DebugPrint
和%SystemBreak
了
exploit
经过上面的分析,这题就变向的变成了一道堆题目,利用过程如下:
- 从
unsortedbin
里泄露libc地址 - 由于ArrayBuffer在分配的时候使用calloc分配的,所以先把0x70大小的tcache填满,在释放一个chunk到0x70大小的fastbin
- 修改fastbin的fd,使其指向
__malloc_hook-0x23
,在改__malloc_hook
为one_gadget就行
最终exp:
1 | // leak libc |
结果:
one_gadget的地址可能会因为不同版本的libc而不同
解出来后,去搜索了下别人的wp,看到能让Array使用malloc分配内存的办法:
1 | let a = {}; |
这样子的话好利用多了,直接改tcache的fd就行:
1 | // leak libc |
总结
这次是真的自己认认真真的没有参考别人的wp来解的(算是能看的懂简单的v8了?哈哈,其实连皮毛都不算),希望今年的tctf不要爆零