Chrome漏洞分析与利用(一)——Windows V8漏洞环境编译

工具:

  • ninja: ninja git地址
  • depot-tools: depot-tools git地址
  • vs2019: 官网下载,使用默认安装路径,否则在用v8gen.py时会因为路径问题导致失败,如果非要使用自定义路径,则需要去改v8源码目录中的vs_toolchain.py脚本,其中有一行代码path = os.path.expandvars('%ProgramFiles(x86)%' + '/Microsoft Visual Studio/%s' % version)会去默认安装路径查找vs,可以将此路径改为自定义的vs安装路径
  • git: 官网下载
  • python2: 需要用到urllib2模块所以使用py2,pip直接安装urllib2可能会报错,直接装urllib3即可

环境配置

因为需要从google下载大量的内容所以需要代理
git代理设置:

 git config --global https.proxy http://地址:端口
 git config --global https.proxy https://地址:端口
 git config --global http.proxy socks5://地址:端口
 git config --global https.proxy socks5://地址:端口

系统环境变量设置,此处配置完如果依然报错[fetch 1/2] RPC failed transiently....那就重启以下:
http://地址:端口
在这里插入图片描述
系统代理设置(需要使用管理员权限运行cmd):
netsh winhttp set proxy http://地址:端口
再在设置里将代理打开
在这里插入图片描述
将ninja与depot_tools路径写入系统默认路径
在这里插入图片描述
然后在命令行中设置一个临时环境变量
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

编译流程

创建一个用于存放v8代码的目录cd进入,执行

fetch v8
gclient sync

如果代理配置有误可能会一直卡住或一直报以下错误
在这里插入图片描述
假设现在要编译存在issue-1196683(CVE 2021-21220)漏洞环境,打开issue链接:https://bugs.chromium.org/p/chromium/issues/detail?id=1196683
找到commit并进入
在这里插入图片描述
由于此版本已经将漏洞修复,所以找到上一个版本
在这里插入图片描述
拷贝其commit哈希
在这里插入图片描述
执行以下指令将v8版本回滚到存在漏洞的版本,并重新执行gclient sync

git reset --hard 1e4b1c521a491c7487028b7f2aec550c1b36606b
gclient sync

然后在v8源码根目录下执行以下指令进行编译,编译过程会很漫长,而且可能会占满CPU,如果已经编译过debug版本还需要编译release版本的话,直接忽略以上步骤直接执行以下内容将所有debug都替换为release即可,但要注意的是必须要设置DEPOT_TOOLS_WIN_TOOLCHAIN环境变量否则还是会报错。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python tools/dev/v8gen.py -vv x64.debug
ninja -C out.gn\x64.debug

编译好后可以在out.gn\x64.debug目录下找到编译好的exe以及dll文件,其中d8.exe可以帮我们进行一些基础的调试分析
在这里插入图片描述

补充

注意点一

除此以外在编译较新版本v8时还可能会遇上以下情况
在这里插入图片描述
然后去查看FILE_INFO_BY_HANDLE_CLASS的定义后发现存在一句条件编译指令。在这里插入图片描述
基本可以确定就是这个条件编译指令的原因,将其注释后再编译,出现以下报错
在这里插入图片描述
查看后依然还是条件编译指令在判断NTDDI版本时出的问题
在这里插入图片描述
将其注释后再编译,还剩一个报错。
在这里插入图片描述
查看该函数在Version_Helper.h中的定义,发现还是NTDDI版本的问题,再注释编译

然后发现win系统库中存在大量此类条件编译一个一个注释掉显然不现实,然后观察报错输出后发现两个sdk版本号对不上,10.0.19041.0是我的,而后面的10.0.20348.0我都没有装。
在这里插入图片描述
在vs拓展工具里去掉10.0.19041.0,安装10.0.20348.0,相当于将sdk升级至win10平台最新版
在这里插入图片描述
然后编译完成,总结来讲在编译新版v8时最好将sdk也升至最新版

注意点二

如果升级过sdk后使用python tools/dev/v8gen.py -vv x64.debug生成编译配置文件时出现如下报错:

 C:\vun\v8\buildtools\win\gn.exe gen out.gn/x64.debug --check
    -> returned 1
  ERROR at //build/config/win/BUILD.gn:297:27: Script returned non-zero exit code.
    vcvars_toolchain_data = exec_script("../../toolchain/win/setup_toolchain.py",
                            ^----------
  Current dir: C:/vun/v8/out.gn/x64.debug/
  Command: C:/vun/depot_tools/bootstrap-2@3_8_10_chromium_23_bin/python/bin/python.exe C:/vun/v8/build/toolchain/win/setup_toolchain.py "C:\Program Files (x86)/Microsoft Visual Studio/2019/Community" "C:\Program Files (x86)\Windows Kits\10" "C:\Windows\System32;C:\Windows\SysWOW64;Arm64Unused" win x64 none
  Returned 1.
  See //build/config/BUILDCONFIG.gn:343:5: which caused the file to be included.
      "//build/config/win:lean_and_mean",
      ^---------------------------------
  Traceback (most recent call last):

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>

      main()

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main

      vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList

      file_name, env_name, '\n'.join(parts))

  AssertionError: user32.lib is not found in LIB:

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64

  Check if it is installed.

  Traceback (most recent call last):

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>

      main()

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main

      vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList

      file_name, env_name, '\n'.join(parts))

  AssertionError: user32.lib is not found in LIB:

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x86

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x86

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x86

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86

  Check if it is installed.

  GN gen failed: 1
Traceback (most recent call last):
  File "tools/dev/v8gen.py", line 307, in <module>
    sys.exit(gen.main())
  File "tools/dev/v8gen.py", line 301, in main
    return self._options.func()
  File "tools/dev/v8gen.py", line 169, in cmd_gen
    gn_outdir,
  File "tools/dev/v8gen.py", line 211, in _call_cmd
    stderr=subprocess.STDOUT,
  File "C:\vun\depot_tools\bootstrap-2@3_8_10_chromium_23_bin\python\bin\lib\subprocess.py", line 223, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['C:\\vun\\depot_tools\\bootstrap-2@3_8_10_chromium_23_bin\\python\\bin\\python.exe', '-u', 'tools\\mb\\mb.py', 'gen', '-f', 'infra\\mb\\mb_config.pyl', '-m', 'developer_default', '-b', 'x64.debug', 'out.gn/x64.debug']' returned non-zero exit status 1

打开v8\build\toolchain\win目录下的setup_toolchain.py文件百分之九十的路径问题报错都源于该脚本文件,该脚本文件较为奇葩它将sdk版本号直接写死在脚本文件里,注意核查该处sdk版本号与你所配置使用的sdk版本号是否一致,不一致就改
在这里插入图片描述
更改后输出成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值