Mac下调试v8漏洞的方法

栏目: 编程工具 · IOS · 发布时间: 6年前

内容简介:要编译在想放置源代码的目录下运行

v8chrome 使用的 javascript 引擎,这里总结一下在 mac 下编译的方法以及如何使用 xcode 进行源码调试。

安装依赖和下载源码

要编译 v8 ,首先需要 depot_tools ,获取方法可以在下面的页面中下载压缩包:

https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master
 

在想放置源代码的目录下运行 fetch v8 下载源代码和依赖,这一步需要翻墙,我使用的是 ss ,在终端中运行如下命令设置代理,具体端口号根据配置决定:

export http_proxy=http://127.0.0.1:1087;export https_proxy=http://127.0.0.1:1087;
 

进入源码目录,运行 gclient sync ,生成所需依赖。

编译v8引擎

需要安装有 xcode ,并且安装了 command line tools ,安装完 xcode 后需要打开同意 license ,然后在命令行运行 sudo xcode-select -s /Applications/Xcode.app

在源代码目录内运行 tools/dev/v8gen.py x64.debug ,然后运行 ninja -C out.gn/x64.debug 编译 debug 版,需要等待一会:

$ tools/dev/v8gen.py x64.debug -vv
################################################################################
/usr/bin/python -u tools/mb/mb.py gen -f infra/mb/mb_config.pyl -m developer_default -b x64.debug out.gn/x64.debug
 
  Writing """\
  is_debug = true
  target_cpu = "x64"
  v8_enable_backtrace = true
  v8_enable_slow_dchecks = true
  """ to /Users/seviezhou/Downloads/Tencent/v8/v8/out.gn/x64.debug/args.gn.
 
  /Users/seviezhou/Downloads/Tencent/v8/v8/buildtools/mac/gn gen out.gn/x64.debug --check
  Done. Made 95 targets from 64 files in 2976ms
 
$ ninja -C out.gn/x64.debug
ninja: Entering directory `out.gn/x64.debug'
[1550/1550] STAMP obj/gn_all.stamp
 

获取漏洞对应版本调试

这里以 bug-800032 为例, poc 如下:

class Derived extends Array {
  constructor(a) {
    // Syntax Error
    const a = 1; // const or let can trigger bugs
  }
}
 
let o = Reflect.construct(RegExp, [], Derived);
 

在官方的 commit 中找到对应的 change id ,然后可以使用 git checkout [change-id] 来切换版本, [change-id]change id 的前十位,一个 commit 看起来像是这样:

commit  8361fa5896450e099539668cd7c637d01923d4ef    [log] [tgz]
author  Camillo Bruni <cbruni@chromium.org> Wed Jan 31 00:48:38 2018
committer   Commit Bot <commit-bot@chromium.org>    Wed Jan 31 12:07:56 2018
tree    8aa02b76acf415851fff3c1173a108a86746e9b4
parent  4ca5a577e650180f14159e52c9682dd726b81c5b [diff]
 

那么为了调试漏洞,就要切换到 parent 版本对应的 id 上,也就是运行 git checkout 4ca5a577e6 ,接下来需要重新获取依赖然后编译,这里也要按之前的方法配置终端代理:

gclient sync
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug
 

接下来就可以运行 poc 得到崩溃:

$ ./d8 /Users/seviezhou/Downloads/test.js                                                                                                  
#
# Fatal error in ../../src/objects/map-inl.h, line 323
# Check failed: 0 <= value (0 vs. -1).
#
 
==== C stack trace ===============================
 
    0   libv8_libbase.dylib                 0x0000000105c3253e v8::base::debug::StackTrace::StackTrace() + 30
    1   libv8_libbase.dylib                 0x0000000105c32575 v8::base::debug::StackTrace::StackTrace() + 21
    2   libv8_libplatform.dylib             0x0000000105c963c5 v8::platform::(anonymous namespace)::PrintStackTrace() + 37
    3   libv8_libbase.dylib                 0x0000000105c19a0d V8_Fatal(char const*, int, char const*, ...) + 445
    4   libv8.dylib                         0x0000000102b2c86a v8::internal::Map::SetInObjectUnusedPropertyFields(int) + 1210
    5   libv8.dylib                         0x00000001037d6968 v8::internal::Map::CopyInitialMap(v8::internal::Handle<v8::internal::Map>, int, int, int) + 120
    6   libv8.dylib                         0x00000001037979be v8::internal::JSFunction::GetDerivedMap(v8::internal::Isolate*, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::JSReceiver>) + 686
    7   libv8.dylib                         0x0000000103797585 v8::internal::JSObject::New(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::Handle<v8::internal::AllocationSite>) + 373
    8   libv8.dylib                         0x0000000103aef53d v8::internal::__RT_impl_Runtime_NewObject(v8::internal::Arguments, v8::internal::Isolate*) + 733
    9   libv8.dylib                         0x0000000103aef095 v8::internal::Runtime_NewObject(int, v8::internal::Object**, v8::internal::Isolate*) + 277
    10  ???                                 0x00001878fbf84384 0x0 + 26907902493572
    11  ???                                 0x00001878fc08ae44 0x0 + 26907903569476
Received signal 4 <unknown> 000105c2e071
[1]    23453 illegal hardware instruction  ./d8 /Users/seviezhou/Downloads/test.js
 

可以使用 gdb 直接调试 d8 ,下面讲一下如何使用 xcode 调试源码。

使用xcode源码调试

为了能够更清楚的调试漏洞,可以用 xcode 进行源码调试,首先使用 gn 命令生成对应的 xcode 文件,当然 ide 参数也可以指定为 VS 等其他 IDE ,具体参考 gn gen --help 的帮助:

$ gn gen out/gn --ide="xcode"
Generating Xcode projects took 56ms
Done. Made 93 targets from 63 files in 538ms
 

这样,在 out 目录下就会有 gn 文件夹,里面有 all.xcworkspace 文件,可以直接使用 xcode 打开这个工作区文件,接下来要设置编译的目标,在 Product->Scheme 下选择 d8 ,否则会编译出错,这样就只编译 d8 这个可执行程序,使用 d8 就可以直接调试 v8 的源代码。

然后直接 Build ,编译时间有些长,会自动生成 v8 的链接库,等待编译完成,在 Product->EditScheme 菜单中把 poc 文件作为运行参数,在对应文件中下好断点,直接运行就会断下来了。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

法律程序的意义:对中国法制建设的另一种思考

法律程序的意义:对中国法制建设的另一种思考

季卫东 / 中国法制出版社 / 2005-1 / 10.0

《法律程序的意义:对中国法制建设的另一种思考》内容为现代程序的概念与特征、现代程序的结构与功能、程序与现代社会、中国法律程序的缺陷、程序建设的程序等。一起来看看 《法律程序的意义:对中国法制建设的另一种思考》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具