Mac下调试v8漏洞的方法

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

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

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 文件作为运行参数,在对应文件中下好断点,直接运行就会断下来了。


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

查看所有标签

猜你喜欢:

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

粒子群优化算法及其工程应用

粒子群优化算法及其工程应用

刘波 / 2010-8 / 28.00元

《粒子群优化算法及其工程应用》的主要内容是:粒子群优化(PSO)算法是一种基于群体智能的新兴演化计算技术,广泛用于解决科学研究和工程实践中的优化问题。《粒子群优化算法及其工程应用》主要阐述粒子群优化算法的基本理论及其在机械故障诊断和机械工程测试中的应用成果。全书共5章,第1至3章介绍了PSO算法的原理和各种改进、变体PSO算法的原理,第4章介绍了PSO算法在机械工程领域的应用,第5章介绍了PSO算......一起来看看 《粒子群优化算法及其工程应用》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具