内容简介:要编译在想放置源代码的目录下运行
v8
是 chrome
使用的 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
文件作为运行参数,在对应文件中下好断点,直接运行就会断下来了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- CVE-2018-4990漏洞调试分析记录
- DfMarshal系列漏洞CVE-2018-8550调试记录
- 一个CVE-2017-11882漏洞新变异样本的调试与分析
- PCMan's FTP 漏洞(CVE-2013-4730)详细复现调试过程与exp构造
- iOS常用调试方法:断点调试
- 断点调试和日志调试之间的平衡点:函数计算调试之 Python 篇
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
法律程序的意义:对中国法制建设的另一种思考
季卫东 / 中国法制出版社 / 2005-1 / 10.0
《法律程序的意义:对中国法制建设的另一种思考》内容为现代程序的概念与特征、现代程序的结构与功能、程序与现代社会、中国法律程序的缺陷、程序建设的程序等。一起来看看 《法律程序的意义:对中国法制建设的另一种思考》 这本书的介绍吧!