1. 从蓝桥杯CTF真题出发,聊聊BurpSuite和Wireshark的实战价值
如果你正在准备蓝桥杯CTF比赛,或者刚入门网络安全,对BurpSuite和Wireshark这两个名字肯定不陌生。它们就像剑客手中的剑与盾,一个主攻Web应用,一个洞察网络流量,是解题夺旗不可或缺的核心工具。但很多新手朋友拿到工具后容易陷入迷茫:教程看了不少,功能按钮也认得七七八八,可一到真实的CTF赛题里,还是不知道从何下手,抓了一堆包也分析不出个所以然。问题出在哪?在我看来,是缺少了从“知道工具”到“会用工具”之间的关键桥梁——真题驱动的场景化实战。
单纯学习工具菜单,就像背熟了字典却不会写文章。蓝桥杯CTF的题目,尤其是Web和Misc方向,常常是检验你能否将BurpSuite和Wireshark“用活”的试金石。它们不会直接问你“BurpSuite的Repeater模块是干嘛的”,而是会把漏洞和线索巧妙地隐藏在HTTP请求的某个头里、藏在TCP流的某个数据包里。你需要做的,是带着明确的目标去操作工具,让工具成为你思维的延伸。今天,我就以三道极具代表性的蓝桥杯CTF真题(或类似风格题目)为线索,带你深度串联BurpSuite和Wireshark的核心实战技巧。我们不止步于“怎么做”,更要深挖“为什么这么做”以及“当时我踩了哪些坑”。无论你是希望在蓝桥杯中取得好成绩,还是想夯实自己的CTF基本功,这篇指南都能给你带来直接的帮助。
2. 工具定位与赛题思维:先理清思路,再动手操作
在深入具体题目之前,我们必须建立一个清晰的认知:BurpSuite和Wireshark在CTF中扮演什么角色?它们不是万能的,但在各自的领域内近乎无敌。理解这一点,能帮助你在面对赛题时快速选择正确的“武器”。
2.1 BurpSuite:你的Web协议“手术刀”与“自动化脚本平台”
BurpSuite本质上是一个拦截、查看、修改、重放HTTP/HTTPS请求的集成平台。在CTF的Web题目中,绝大部分漏洞的发现和利用,都离不开对HTTP请求响应周期的精细操控。
- 核心价值:它让你能脱离浏览器黑盒,直接“触摸”到客户端与服务器之间传输的原始数据。一个看似普通的登录框,背后可能是脆弱的会话管理;一个文件上传功能,可能隐藏着绕过检测的技巧。这些都需要你修改请求参数、头信息甚至整个报文结构来验证猜想。
- CTF常见考点关联:
- SQL注入:修改
id、search等参数,通过Repeater模块观察数据库报错信息或返回差异。 - 文件上传漏洞:拦截上传请求,修改
Content-Type、文件名后缀,或添加恶意文件头。 - 目录/敏感信息泄露:使用Intruder模块对常见目录、备份文件路径进行暴力猜解。
- Cookie/Session操纵:修改
Cookie、Authorization等头,尝试越权访问。 - SSRF(服务端请求伪造):修改请求中的URL参数,让服务器访问内部服务。
- 逻辑漏洞:如修改商品价格、订单ID、用户ID等业务参数。
- SQL注入:修改
实操心得:新手常犯的错误是打开BurpSuite就一通乱点。我的习惯是,拿到Web题目URL,先正常用浏览器点一遍,了解大致功能。然后打开BurpSuite的代理,设置好浏览器,再点一遍。这次,所有请求都会在
Proxy -> HTTP history里留下记录。先浏览,再分析,这个顺序能帮你快速定位到可能与漏洞相关的功能点(如登录、搜索、上传、查看详情),而不是在海量请求中迷失。
2.2 Wireshark:网络流量的“显微镜”与“数据取证器”
Wireshark是一个网络封包分析软件,它能捕获流经网卡的所有数据包(需要权限),并提供强大的过滤和统计功能。在CTF中,它主要应对Misc(杂项)和部分涉及网络协议的Web题。
- 核心价值:当赛题提供一个
.pcap或.pcapng流量包文件时,Wireshark就是你唯一的入口。你需要像侦探一样,从成千上万个TCP、UDP、HTTP、DNS等协议的数据包中,找出隐藏的Flag、被窃取的数据或异常的通信行为。 - CTF常见考点关联:
- 协议分析:分析FTP、Telnet等明文协议传输的账号密码。
- 文件提取:从HTTP传输或TCP流中重组并导出传输过的文件(如图片、文档、压缩包)。
- 数据隐写:Flag可能藏在某个数据包的特定字段、负载(Payload)的二进制数据中,或通过协议字段(如ICMP的Data段)隐写。
- 异常流量发现:寻找不常见的端口、异常频繁的请求、带有特殊命令的DNS查询(常用于DNS隧道外带数据)。
- 登录凭证泄露:在HTTP基础认证、Cookie或POST数据中寻找敏感信息。
注意事项:Wireshark功能强大但信息量爆炸。不会用显示过滤器,等于在数据海洋里裸泳。拿到流量包,第一件事不是一个个看包,而是应用过滤器。例如,
http只看HTTP流量,ftp只看FTP流量,tcp.stream eq 0只看第0号TCP流。结合赛题描述(如“管理员上传了一个文件”),能极大缩小排查范围。
2.3 建立解题思维:从结果反推过程
面对一道题,如何决定用BurpSuite还是Wireshark,或者两者结合?
- 题目类型判断:明确是Web题还是Misc题。Web题优先BurpSuite;给流量文件的Misc题必用Wireshark。
- 交互性判断:有可访问的URL、能点击、能输入——这是BurpSuite的战场。只有一个静态文件供下载分析——这是Wireshark(或Foremost、binwalk等)的战场。
- 目标反推:问自己“Flag可能以什么形式存在?”。
- 在Web服务器上某个文件里?→ 用BurpSuite的Intruder目录扫描。
- 是数据库里的某条记录?→ 用BurpSuite测试SQL注入。
- 是网络通信中传输的一个秘密文件?→ 用Wireshark导出对象或跟踪TCP流。
- 是藏在某个数据包负载里的字符串?→ 用Wireshark搜索特定字符串或字节序列。
带着假设去使用工具,你的操作效率会成倍提升。
3. 真题实战一:BurpSuite破解前端验证与敏感信息泄露
场景还原:这是一道典型的蓝桥杯风格Web入门题。题目提供一个简单的文件上传页面,前端JavaScript会检查文件后缀名(只允许.jpg,.png)。上传非图片文件会被拦截。同时,题目提示“Flag在服务器上的某个地方”。
3.1 解题步骤与BurpSuite操作详解
环境准备与初步测试:
- 启动BurpSuite,配置浏览器代理指向Burp(通常是
127.0.0.1:8080)。 - 访问目标URL,是一个上传表单。选择一个PHP webshell文件(如
shell.php)尝试上传。 - 浏览器弹出警告“只允许上传图片格式!”。这是前端验证。
- 启动BurpSuite,配置浏览器代理指向Burp(通常是
绕过前端验证:
- 原理:前端验证仅是为了用户体验,数据最终以HTTP请求形式发往服务器。只要我们能修改这个请求,就能绕过验证。
- 操作: a. 在BurpSuite的
Proxy -> Options中,确保Intercept is on(拦截开启)。 b. 回到浏览器,选择一个正常的图片文件(如test.jpg)点击上传。此时请求会被BurpSuite拦截在Proxy -> Intercept标签页。 c. 在拦截的请求中,找到Content-Disposition部分,将文件名filename="test.jpg"修改为filename="shell.php"。同时,你可能需要将Content-Type从image/jpeg修改为application/x-php(但这并非总是必须,取决于服务器检查逻辑)。 d. 点击Forward放行请求。 - 结果:服务器返回“上传成功!”,并显示了文件路径,如
uploads/shell.php。前端验证被成功绕过。
利用Intruder进行目录扫描:
- 为什么需要:题目说Flag在服务器某处,上传成功只是第一步。我们需要找到Flag文件或包含Flag的页面。常见的存放位置有
/flag、/flag.txt、/index.php.bak、/robots.txt、/.git/等。 - 操作: a. 在
Proxy -> HTTP history中找到你对网站根目录(如GET /)的请求。 b. 右键点击该请求,选择Send to Intruder。 c. 切换到Intruder -> Positions标签。Burp会自动标记一些参数,我们清空所有标记(Clear §),然后在路径部分手动标记。例如,原始路径是/,我们将其改为/§§,然后选中§§,点击Add §。 d. 切换到Payloads标签。在Payload Options中,加载一个常用的目录字典文件(如SecLists中的Discovery/Web-Content/common.txt)。如果没有,可以手动添加一些常见条目:flag, flag.txt, flag.php, .git, robots.txt, admin, backup, index.php.bak等。 e. 点击Start attack开始攻击。Intruder会使用字典中的每一项替换§§,并发起大量GET请求。 f. 观察结果。重点关注状态码(Status)和响应长度(Length)。200状态码通常表示资源存在,403可能表示禁止访问但路径存在,404表示不存在。响应长度突然变化的条目也值得关注。 - 结果:假设扫描发现
/robots.txt返回200,访问它发现内容为Disallow: /secret_backup/。这提示我们存在一个秘密目录。
- 为什么需要:题目说Flag在服务器某处,上传成功只是第一步。我们需要找到Flag文件或包含Flag的页面。常见的存放位置有
访问并获取Flag:
- 在浏览器或Repeater中访问
/secret_backup/,发现目录列表开启,其中有一个flag.txt文件。 - 访问
/secret_backup/flag.txt,获得Flag。
- 在浏览器或Repeater中访问
3.2 核心技巧与避坑指南
- 技巧一:活用Repeater进行手动测试。在Intruder爆破前,可以先用Repeater手动测试几个可疑路径,观察响应特征,有助于在Intruder结果中快速定位。
- 技巧二:关注响应差异,不仅是状态码。有些题目会为存在的路径和不存在的路径返回相同的
200状态码,但响应内容(HTML结构、提示语)或长度不同。在Intruder结果中,按Length排序能帮你快速发现异常。 - 踩坑记录:我曾遇到一道题,前端验证不仅检查后缀,还通过JS计算文件的魔数(Magic Number)。仅仅修改文件名和
Content-Type无效。解决方案:在文件内容开头添加图片的魔数(如GIF的GIF89a),再拼接PHP代码。用BurpSuite拦截上传请求,在十六进制视图(Hex)中直接修改请求体(body),在文件二进制内容前插入对应的魔数字节。这要求你对文件格式有基本了解。 - BurpSuite配置注意:如果目标网站是HTTPS,需要在浏览器中安装并信任BurpSuite导出的CA证书,否则无法拦截解密HTTPS流量。这是新手常卡住的第一步。
4. 真题实战二:Wireshark深度流量分析与文件重组
场景还原:这是一道Misc题目。提供一个名为capture.pcapng的流量包文件。题目描述:“网络管理员发现内部服务器有可疑外联,请分析流量,找到被窃取的文件和Flag。”
4.1 解题步骤与Wireshark操作详解
初步浏览与协议统计:
- 用Wireshark打开
capture.pcapng。首先不要慌,看底部状态栏了解包的总数。 - 点击菜单
统计 -> 协议分级。这个视图告诉你流量中各种协议的占比。如果出现大量FTP-DATA、HTTP或TCP,可能意味着有文件传输。
- 用Wireshark打开
应用显示过滤器快速定位:
- 根据协议分级结果,假设
HTTP流量占比很高。我们在过滤栏输入http并回车,只显示HTTP协议的数据包。 - 观察HTTP请求方法。大量
POST请求可能在上传,GET请求可能在下载。寻找响应状态码为200 OK且Content-Type是application/octet-stream、image/jpeg、application/zip等的包,这很可能就是文件传输。
- 根据协议分级结果,假设
导出HTTP传输的文件:
- 方法一:使用
文件导出对象功能。 a. 点击菜单文件 -> 导出对象 -> HTTP...。 b. 会弹出一个列表,显示所有通过HTTP传输的可识别文件(如图片、文本、压缩包)。 c. 浏览列表,寻找可疑或目标文件(文件名可能包含flag、secret、backup等),选中并点击Save导出。 - 方法二:手动跟踪TCP流并保存。 a. 选中一个疑似传输文件的HTTP响应包(通常是较大的数据包)。 b. 右键选择
追踪流 -> TCP流。此时Wireshark会重组该TCP连接的所有数据,并在一个窗口中显示。 c. 在TCP流窗口的底部,将显示格式改为原始数据。这样你看到的就是最原始的字节流。 d. 点击另存为...,保存为一个二进制文件。注意,这保存的是整个TCP流的原始数据,可能包含HTTP头和文件体。
- 方法一:使用
从原始数据中提取文件(关键步骤):
- 如果你用方法二保存了原始数据,用文本编辑器(如VS Code, Notepad++)的十六进制模式打开它。
- 你需要找到文件体的真正开始位置。一个典型的HTTP响应原始数据如下:
HTTP/1.1 200 OK Content-Type: application/zip Content-Length: 12345 [这里是ZIP文件的二进制内容] - 文件体开始于第一个空行(
\r\n\r\n)之后。在十六进制视图里,空行对应0D 0A 0D 0A。找到这个序列,它后面的字节就是文件内容。 - 从
0D 0A 0D 0A之后开始,选中所有剩余的十六进制数据,复制,然后新建一个文件,用十六进制编辑器粘贴进去,保存为secret.zip。 - 或者,更简单的方法:在Wireshark的TCP流窗口,直接找到文件内容的开始,然后用鼠标精确选中文件体的十六进制部分(从
PK(ZIP头)或其它文件头开始),右键复制 -> ...作为十六进制流。然后粘贴到十六进制编辑器中新建文件。这需要一些经验识别文件头。
分析提取的文件:
- 解压或打开导出的文件。可能是加密的ZIP,需要密码。密码可能藏在流量包的其他地方。
- 回到Wireshark,在过滤栏输入
ftp或tcp contains "password"或http.request.uri contains "pass",寻找可能泄露密码的通信。 - 也可能Flag就直接在导出的图片文件里,需要用Stegsolve等工具进行图片隐写分析。
4.2 核心技巧与避坑指南
- 技巧一:善用“追踪流”功能。这是Wireshark在CTF中最核心的功能之一。不仅能看HTTP,对于FTP、Telnet等明文协议,直接追踪TCP流就能看到完整的交互命令和结果,密码可能一目了然。
- 技巧二:字符串搜索是捷径。在Wireshark中,按
Ctrl+F,选择“字符串”和“分组字节流”,搜索flag、key、password、secret等关键词。有时Flag会以明文形式出现在某个数据包的负载里。注意大小写和编码。 - 技巧三:关注DNS协议。有些题目会使用DNS隧道外带数据。过滤
dns,观察那些域名非常长、子域名部分看起来像Base64编码的查询请求(如aGVsbG8=.example.com)。这些子域名部分解码后可能就是Flag。 - 踩坑记录:导出文件后打不开或损坏。常见原因:
- 导出的是整个TCP流原始数据,包含了HTTP头。需要用上述方法剥离HTTP头。
- 文件传输可能分片在多個TCP包中。使用
文件 -> 导出对象 -> HTTP功能,Wireshark会自动帮你重组。如果这个功能里没有,说明Wireshark没有识别出完整的HTTP文件传输,需要手动追踪TCP流并正确截取。 - 文件本身被加密或编码。需要结合其他线索(如流量中泄露的密码、Key)进行解密。
- 性能提示:如果流量包非常大,应用一个精确的过滤器(如
tcp.port == 80)可以极大提升Wireshark的响应速度。
5. 真题实战三:BurpSuite与Wireshark的联动——从Web攻击到流量取证
场景还原:这是一道综合题。提供一个Web服务URL,同时提示“攻击者的操作被记录在了流量中”。你需要先利用Web漏洞获取一个“密钥”,然后用这个密钥去解密Wireshark流量包中隐藏的最终Flag。
5.1 第一阶段:利用BurpSuite进行Web漏洞利用
信息收集与漏洞发现:
- 访问目标Web,是一个留言板系统,可以提交标题和内容。
- 测试发现,提交内容后,会在页面显示,且内容似乎没有过滤。尝试提交``,成功弹窗。存在XSS,但这可能不是目标。
- 查看页面源代码,发现一个有趣注释:
<!-- debug: /console -->。访问/console,发现一个Flask调试器PIN码保护的交互式控制台。 - 已知Flask调试器在开启debug模式且知道PIN码时可以执行代码。PIN码通常与服务器信息有关。题目可能希望我们获取PIN码或利用其他漏洞。
利用SSTI(服务端模板注入)获取信息:
- 在留言内容处,尝试提交
{{7*7}},回显49。确认存在服务端模板注入(SSTI),且很可能是Jinja2(Flask默认)。 - 利用SSTI读取服务器上的敏感文件,获取计算PIN码所需的信息。构造Payload:
{{ ''.__class__.__mro__[1].__subclasses__() }}来列出所有子类,寻找可利用的类(如<class 'subprocess.Popen'>)来执行命令。 - 更直接地,Flask调试PIN码与
/etc/machine-id、/proc/self/cgroup以及一个与用户相关的字符串有关。我们可以用SSTI读取这些文件:{{ get_flashed_messages.__globals__.__builtins__.open('/etc/machine-id').read() }}{{ get_flashed_messages.__globals__.__builtins__.open('/proc/self/cgroup').read() }}
- 将这些信息组合,可以在本地根据公开算法计算出PIN码(网上有现成脚本)。或者,题目可能简化了,SSTI直接能执行命令找到密钥文件:
{{ get_flashed_messages.__globals__.__builtins__.__import__('os').popen('find / -name "*key*" 2>/dev/null').read() }}。 - 假设找到密钥文件
/tmp/secret.key,读取它:{{ get_flashed_messages.__globals__.__builtins__.open('/tmp/secret.key').read() }},得到密钥:ThisIsASecretKey123。
- 在留言内容处,尝试提交
5.2 第二阶段:使用Wireshark进行流量分析与解密
获取并分析流量包:
- 题目描述提到“攻击被记录”。在Web服务器上可能有一个地方可以下载流量包,或者第一步利用SSTI执行命令
tcpdump生成包并下载。假设我们通过SSTI找到了一个capture.pcap文件并下载到本地。 - 用Wireshark打开
capture.pcap。
- 题目描述提到“攻击被记录”。在Web服务器上可能有一个地方可以下载流量包,或者第一步利用SSTI执行命令
定位加密或异常流量:
- 协议分级显示,除了HTTP,还有大量
TLS或未知协议流量。HTTP流量我们很熟悉了,Flag很可能藏在加密或非标准流量里。 - 过滤
tcp.port != 80 and tcp.port != 443,排除常见Web端口,观察其他端口的通信。 - 发现目标服务器(假设IP是
192.168.1.100)与另一个IP(10.0.0.99)在端口9999上有大量TCP通信。追踪这个端口的TCP流(tcp.stream eq X)。
- 协议分级显示,除了HTTP,还有大量
解密或分析自定义协议:
- 在TCP流中,看到的数据是乱码,像是加密的。联想到第一阶段获得的密钥
ThisIsASecretKey123。 - 假设:这是一个简单的XOR加密或AES加密的流量。我们需要将TCP流中的原始数据导出,用密钥解密。
- 操作: a. 在追踪到的TCP流窗口,显示格式选
原始数据,点击另存为...保存为encrypted.bin。 b. 写一个简单的Python解密脚本。假设是XOR加密(CTF常见):
c. 运行脚本,查看import binascii # 读取加密数据 with open('encrypted.bin', 'rb') as f: cipher_data = f.read() # 密钥 key = b'ThisIsASecretKey123' key_length = len(key) # 逐字节XOR解密 plain_data = bytearray() for i in range(len(cipher_data)): plain_data.append(cipher_data[i] ^ key[i % key_length]) # 输出解密结果 print(plain_data.decode('utf-8', errors='ignore')) # 或者直接写入文件 with open('decrypted.txt', 'wb') as f: f.write(plain_data)decrypted.txt。可能会发现其中包含清晰的通信记录,比如攻击者执行的命令cat /flag和服务器返回的最终Flag。
- 在TCP流中,看到的数据是乱码,像是加密的。联想到第一阶段获得的密钥
5.3 核心技巧与避坑指南
- 技巧一:保持工具联动思维。CTF综合题往往环环相扣。Web漏洞获取的字符串(密钥、提示、文件名)很可能是打开下一个关卡(流量分析、密码学、隐写)的钥匙。要有意识地将不同阶段获得的信息关联起来。
- 技巧二:Wireshark的“专家信息”。点击
分析 -> 专家信息,Wireshark会汇总警告、错误、注意等信息。有时这里会提示“乱序报文”、“重复确认”等,可能暗示流量被干扰或存在隐蔽信道,值得深入分析。 - 技巧三:自定义Wireshark列。默认的列可能不够用。你可以右键点击列头,添加自定义列。例如,添加
http.request.uri作为一列,可以快速浏览所有HTTP请求的路径,非常方便。 - 踩坑记录:在SSTI利用时,Payload因为特殊字符(如引号、空格)被WAF或简单过滤拦截。解决方案:使用Jinja2的字符串连接、属性访问、参数传递等特性进行绕过。例如,用
request.args获取参数来替代字符串字面量:{{().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].os.popen(request.args.cmd).read()}}&cmd=ls。在BurpSuite的Repeater中,可以方便地修改和测试这些复杂Payload。 - 关于加密流量:如果密钥不对或加密方式不是XOR,解密会失败。需要观察加密数据的特征(如开头是否有
Salted__标识AES加密),或者尝试其他常见算法(如Base64编码后看起来的乱码)。有时密钥需要经过一定的变换(如MD5哈希)后再使用。
6. 备赛进阶:效率提升与资源推荐
掌握了基本操作和解题思路后,想要在比赛中更快人一步,就需要在效率和方法论上下功夫。
6.1 打造你的BurpSuite“军火库”
- 插件(Extensions)是战斗力倍增器:
- Turbo Intruder:比自带Intruder更快、更强大的爆破工具,适合大型字典攻击。
- ActiveScan++:增强主动扫描能力,能发现更多变种的漏洞。
- AuthMatrix:可视化越权测试插件,对于逻辑漏洞测试非常直观。
- Logger++:更强大的历史请求记录与搜索功能。
- Hackvertor:方便地对Payload进行各种编码、加密、哈希转换。
- 安装方法:在
Extender -> BApp Store中可以直接搜索安装。
- 项目与配置管理:为不同的比赛或目标创建不同的BurpSuite项目文件(
.burp),保存你的爬虫数据、历史记录、插件配置等。比赛开始时就加载对应的项目,节省时间。 - 自定义字典:收集并整理适合CTF的字典,包括短小精悍的目录字典、参数名字典、备份文件字典等。
SecLists项目是一个很好的起点。
6.2 掌握Wireshark高阶分析技巧
- IO Graphs与Endpoints:
统计 -> I/O图表和统计 -> 端点可以帮助你宏观了解流量特征,比如哪个IP在特定时间段内发送了海量数据,可能正在传输文件或进行DoS攻击。 - Follow UDP Stream:不要只记得TCP流。对于DNS、DHCP等UDP协议,右键也有
追踪流 -> UDP流的选项。 - 着色规则:你可以自定义着色规则,比如将所有包含特定字符串(如
flag)的数据包标记为醒目的颜色,便于在大量数据包中快速定位。 - TSHARK命令行:对于非常大的流量包,Wireshark图形界面可能卡顿。学习使用
tshark(Wireshark的命令行版本)进行快速过滤和提取。例如:tshark -r capture.pcap -Y "http" -T fields -e http.request.uri > uris.txt可以快速提取所有HTTP请求的URI到文件。
6.3 赛时心态与时间管理
- 五分钟原则:拿到题,快速判断类型和工具。如果5分钟内毫无头绪,果断标记后看下一题。CTF是抢分游戏,时间有限。
- 团队协作:如果是团队赛,明确分工。一人专攻Web,一人专攻Misc,一人专攻Pwn等。但工具使用(BurpSuite, Wireshark)是基础,最好人人都会。
- 善用搜索:遇到不认识的协议、不熟悉的漏洞类型,快速搜索(CTF Wiki、相关博客)是关键。但要有针对性地搜索,例如“Flask debug PIN码计算”、“Wireshark 导出 加密 TCP流 数据”。
- 保持环境稳定:比赛前确保BurpSuite、Wireshark、Python环境、常用脚本都正常运行。准备好虚拟机快照,以防环境崩溃可以快速恢复。
工具的学习永无止境,但通过真题驱动的实战训练,你能最快地掌握其核心精髓。BurpSuite和Wireshark的强大,不在于功能繁多,而在于你能在多短的时间内,让它们帮你验证一个猜想、发现一条线索。从这三道真题出发,希望你能建立起“工具为思路服务”的实战思维。在接下来的练习中,不妨多找一些历年赛题,先自己尝试,卡住了再去看Writeup(解题报告),对比自己的思路和高手思路的差距,这才是提升的捷径。