0x00 前言
时间过得太快,本来还想再win7上再战几年后转win10用windbg,结果win7在2019年年底已经停止维护了。今年2月有停止了edge的维护。前几篇博文还停留在xp的漏洞阶段。最近开始捡起windows的漏洞调试技术,准备再战,结果win10下的windbg一致提示找不到符号,郁闷了。
win7 的符号配置可以参考之前的这篇windbg符号路径设置,当然基本内容是一样的
0x01 配置符号文件
在windbg的命令行中直接输入:
0:040> .sympath SRV*c:\localsymbols*https://msdl.microsoft.com/download/symbols
0:040> .reload
这里与之前不一样的是,微软官网已经启用https的服务了,所以url中不再是http而是https。
结果提示找不到符号文件,为啥呢?
需要开启打印日志看下
0x02 带日志的符号文件下载
在windbg的命令行中直接输入:
0:040> !sym noisy
0:040> .sympath SRV*c:\localsymbols*https://msdl.microsoft.com/download/symbols
0:040> .reload /f
看下报错日志
0:034> !sym noisy
noisy mode - symbol prompts on
0:034> .reload /f
Reloading current modules
.
SYMSRV: BYINDEX: 0x2
c:\localsymbols*https://msdl.microsoft.com/download/symbols
iexplore.pdb
8AA5D5C87EC4C09B7AAD89E8BC3AB2181
SYMSRV: UNC: c:\localsymbols\iexplore.pdb\8AA5D5C87EC4C09B7AAD89E8BC3AB2181\iexplore.pdb - path not found
SYMSRV: UNC: c:\localsymbols\iexplore.pdb\8AA5D5C87EC4C09B7AAD89E8BC3AB2181\iexplore.pd_ - path not found
SYMSRV: UNC: c:\localsymbols\iexplore.pdb\8AA5D5C87EC4C09B7AAD89E8BC3AB2181\file.ptr - path not found
SYMSRV: HTTPGET: /download/symbols/iexplore.pdb/8AA5D5C87EC4C09B7AAD89E8BC3AB2181/iexplore.pdb
SYMSRV: HttpSendRequest: 800C2EFD - ERROR_INTERNET_CANNOT_CONNECT
SYMSRV: RESULT: 0x800C2EFD
DBGHELP: C:\Program Files\Internet Explorer\iexplore.pdb - file not found
DBGHELP: iexplore.pdb - file not found
DBGHELP: iexplore - no symbols loaded
.
划重点
SYMSRV: HttpSendRequest: 800C2EFD - ERROR_INTERNET_CANNOT_CONNECT
这里提示http请求错误,LZ抓了个包看了看,麻蛋,已经建立https连接了,但是没几个交易就被reset
了。
有种不祥的预感。
google了一下,有用的信息基本都是中文结果,英文检索几乎没有提过这个问题。这暗示着只有国内的民工才会遇到。。翻了翻帖子,印证了长城在年初阻挡了这个服务。
0x03 配置代理
在环境变量中设置符号下载代理
变量名为:_NT_SYMBOL_PROXY
变量值为:127.0.0.1:8080
重新启动windbg,再来一发就可以下载了。
然而,事情总没有想象的顺利,经过LZ亲测socks5的代理无法下载符号文件。如果你的是socks代理,可以用脚本下载,具体参见下一小节。
0x04 写脚本手动下载pdb文件
脚本run.py源码
#!/usr/bin/env python
import requests
from urllib.parse import urljoin
import os
import logging
LOG_LEVEL = logging.DEBUG
def download_file_by_curl(url, outdir, filename):
newpath = os.path.join('./downloads/',os.path.dirname(outdir))
logging.info(newpath)
os.system('mkdir -p %s;'%newpath)
os.system('cd %s;curl -OL %s'%(newpath,url))
def main():
filename = "windbg.log"
outdir = './downloads/'
main_url = 'https://msdl.microsoft.com/'
with open(filename, 'r') as fp:
content = fp.readlines()
for rline in content:
line = rline.strip()
if line.startswith('SYMSRV: HTTPGET:'):
m = line.split(': ')
url =urljoin(main_url, m[2])
pdb_name = m[2][len('/download/symbols/'):]
logging.info("{} {}".format(url, pdb_name))
download_file_by_curl(url, pdb_name, filename)
if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s', level=LOG_LEVEL)
main()
使用说明
- 把windbg的报错日志保存为windbg.log
mkdir downloads
python3 run.py
- 把downloads下的文件转移到win10下的符号目录即可
展示下战果
0x05 参考文献
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/index
https://programlife.net/2020/02/23/windows-debugging-symbols-proxy-rules/
https://bbs.pediy.com/thread-256863.htm