ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

BUUCTF新手解题攻略:CTF题型分类与flag获取技巧

BUUCTF新手解题攻略:CTF题型分类与flag获取技巧 谁说过“教练我想打CTF”来着第一次在BUUCTF上面点开题目列表看到FLAG1这种签到题我甚至没搞明白什么是flag。后来才知道CTF里所有题目的最终目标几乎都是找到那串特殊格式的字符串通常长成flag{...}这样的花括号包裹的文本找到之后再提交到平台上换分数。真正打CTF的生涯就是从找第一面flag开始的。这篇文章不是大赛复盘而是一份给还没入门的你准备的BUUCTF解题地图。围绕你在新手期最常遇到的几类题型Web、密码学、杂项、逆向把“拿到题目之后先干什么、flag藏在哪里、卡住了怎么排查”逐个拆开讲。不管是完全零基础还是已经刷了几道题但总是找不到方向的人这份内容都能让你少走不少弯路。1. 给BUUCTF画一张地图这个平台到底让你练什么1.1 题型分类与flag位置的基本盘BUUCTF是很多新人开始打CTF的第一站因为它把常见题目都聚在一个在线平台上省去了自己搭比赛环境的麻烦。它的题目分类大概有这么几大块Web、Reverse逆向、Pwn二进制漏洞利用、Crypto密码学、Misc杂项、Mobile安卓逆向。每一类的主攻方向完全不同但你作为新手不用一上来就面面俱到。先抓住两类最“友好”的题——Web和Misc它们对底层系统知识要求相对低更多是考验观察力和工具熟练度。Crypto也很适合起步只要会识别编码和简单密码通常很快能拿到第一个flag。而Pwn和Reverse需要掌握汇编、内存布局、程序运行机制这些硬知识建议放到后面慢慢啃。下表是我常用的判题思路拿到题目先对号入座题型题目常见特征flag常见藏身位置Web给一个网址或在线页面有交互入口源码注释、请求响应、数据库回显、文件上传点Crypto给一串编码文本、图片或加密文件解码后的明文、爆破后的口令、组合拼接结果Misc给一张图片、一段音频、一个压缩包文件尾部隐藏数据、图片像素位、隐写工具提取结果Reverse给一个可执行文件、apk包、加密脚本程序逻辑计算得到、内存动态调试得到Pwn给一个二进制服务开放远程端口拿到shell后读取服务器上的flag文件1.2 新人第一次打开平台时该干什么注册账号之后先不要急着打题花十分钟把页面结构和工具栏看一遍。BUUCTF的普通用户界面左上角是题库分类右侧通常显示在线题目列表点开一道题会进入一个题目描述页面有的题会提供一个在线访问地址有的需要你下载附件。很多新人栽的第一个跟头就是以为题目页面里的描述就是全部漏掉了底下的下载链接结果在网页上瞎试半小时。我建议把环境准备好再动手一台装了Python的电脑、一个现代浏览器、一个能打开十六进制文件的编辑器、还有一个压缩包解压工具。这些看起来不起眼但是覆盖了八成入门题的需求。等你看题频率上来了再把Burp Suite、Wireshark、Ghidra这类专业工具装上。记住工具不是越多越好而是要用得越熟越好。2. Web题破解flag不写在界面上的时候要去哪找2.1 打开题目先干这三件不起眼的事Web题最容易入手也最容易“卡得莫名其妙”。原因在于flag往往不在页面正文里而是藏在你没注意到的角落。第一件事是看源代码。用浏览器打开题目网址右键选择“查看网页源代码”或者直接按F12打开开发者工具。我见过大量签到级Web题直接把flag写在HTML注释里甚至写在JavaScript文件里就差没贴在你脸上了。有些同学上来就想着“爆破”“注入”结果连F12都没按过这种低级失误真的很冤。第二件事是看请求和响应。F12切到Network网络标签刷新一下页面把每一个请求点开看。flag可能在响应头里可能在一个不起眼的Set-Cookie里也可能在某个动态接口返回的JSON里。曾有道题把flag拆成两半一半在首页源码另一半在JS请求的响应头里你只翻一个地方是永远凑不齐的。第三件事是试参数。如果URL里带着id、file、page这类参数尝试修改它的值。比如把?id1改成?id2观察页面变化把?fileindex.html改成?fileflag或?file../../../../etc/passwd看有没有异常回显。这些都属于Web里最基础的“参数操控”思路不涉及高深漏洞但恰恰是很多新手忽略的突破口。2.2 命令执行题是怎么把flag吐出来的BUUCTF里有一类很经典的Web题题目描述特别短只给了一个输入框加上一句提示比如“请ping一下某个IP”。这种题的背后逻辑是把你的输入拼接到系统命令里最常见的是拼进ping命令。如果代码写的是ping 参数而你输入127.0.0.1;ls分号在命令行中代表“接着执行下一条命令”那么ls就会被执行页面就可能把目录列表显示出来。常见的拼接符号还有|、、||、反引号以及$(命令)这种写法。这类题目在热词里常被提到“命令执行passthru”其实是同一个意思PHP的passthru()函数把命令结果直接输出到浏览器方便你观察。实际做题时可以先传一个无害命令比如ls、cat flag也可以直接猜flag文件名常见的可能是flag.php、flag.txt、flag_1、flag{...}。一下出不来不要急着上工具多试几个常见文件名。这类题考察的就是你对命令语法和文件系统常识的熟悉程度。2.3 SQL注入和“绕过去”的入门形态还有一类Web题看起来像个查询系统输入id就能查出信息。新手最容易在这里一头雾水因为页面除了“报错”和“无结果”之外什么提示都不给。这种题大概率是SQL注入。入门阶段不需要你背大量payload只要记住一个判断方法输入1观察是否报错输入1 or 11观察是否能查出更多内容输入1 union select 1,2,3--观察页面是否发生变化。但SQL注入的变体非常多有些题做了过滤会把select、union、空格等关键字拦掉这时候就得考虑大小写绕过、注释符绕过、双写绕过等技巧。我的建议是新手碰到注入题不要硬啃先把平台里“SQL注入”专题的前三道题做扎实每道题的报错、回显、盲注逻辑都记下来之后再去看复杂变体。很多人在一道注入题目上卡一晚上不是思路不对而是对“哪些字符被过滤了”没有概念。埋个伏笔这类题后边多半要配合Burp Suite改包纯靠浏览器地址栏操作效率极低。3. Crypto题解题套路把一串不像人话的字符还原出来3.1 先识别编码再谈解密Crypto题看起来跟数学关系很大其实入门阶段十个里有七个是“编码题”。你看到的不是密文而是一段被某种规则编码过的文本。常见的情况有Base64字符集A-Z、a-z、0-9、、/末尾可能带有号。看到这种特征直接用base64解码试试。十六进制一串由0-9和a-f组成的长字符串尝试hex解码转出来可能是ASCII字符也可能是下一层编码。URL编码出现大量%加两位数字比如%66%6c%61%67URL解码即可。ROT13/凯撒字母整体移位ROT13就是位移13位通常一眼看不出来但你复制进在线工具里换两三个偏移量就能识别。识别比解密重要。我见过很多新人拿到一串Base64就开始用凯撒暴力跑跑了半天什么结果都没有其实第一层就是Base64解出来里面藏着一串十六进制再转一下就是flag。这个过程跟剥洋葱一样每剥一层要先判断它长什么样、属于哪类编码而不是盲目套工具。3.2 用CyberChef和随波逐流这类工具不丢人很多老手会推荐你用CyberChef因为它可以把很多操作拖在一起形成一条“配方”比如先Base64解码、再十六进制转文本、再统一替换字符一次执行完。这个特性在多层编码题里特别好用你不知道要解几层但可以把解码链路直接拖出来逐层调试哪一层出问题立刻看得明明白白。另一款国产工具“随波逐流”被很多CTF玩家当成“瑞士军刀”它把编码转换、加密解密、哈希计算、词频分析都集成在一个窗口里。新手用它省去来回切换在线工具的麻烦尤其是遇到疑似古典密码的文本时它能直接把常见的凯撒、维吉尼亚、栅栏密码全部枚举一遍效率很高。有人觉得用工具就算是作弊这种想法完全没有必要。CTF比的是“是否能从给定数据里还原出flag”工具只是眼睛和手的延伸。但如果只会点按钮不理解原理遇到工具没覆盖的变体就会卡死。所以我的习惯是先用工具跑再打开工具对应的算法说明把原理看明白一遍下次就能手写一个脚本。3.3 简洁但好使的数段实战定位法当你拿到一段Crypto题的数据不知道怎么下手时按这个顺序排查判断字符集。如果只有字母和数字优先尝试Base64、十六进制、ROT、进制转换。判断显示形态。如果含有大量{}字符、等号、斜杠优先考虑Base64族。判断长度。长度是8的倍数且以结尾几乎可以锁定Base64长度是偶数且全是十六进制字符直接转hex。判断是否像句子。如果解码后得到一串英文单词但顺序混乱考虑栅栏密码或倒序。最后才考虑真正的加密算法。真正的对称加密题目会直接给出密钥或留下非常明显的算法线索通常不会让你盲猜。附一个常见的Python解码小脚本我平时就放在桌面随时用import base64 s 这里贴要处理的内容 # Base64解码 print(base64.b64decode(s).decode()) # 十六进制解码 print(bytes.fromhex(s).decode()) # 凯撒全部偏移枚举 for i in range(26): print(i, .join(chr((ord(c) - 97 i) % 26 97) if a c z else c for c in s))4. Misc题大杂烩flag被塞进图片、音频和压缩包缝隙里4.1 先看文件属性再查文件尾部Misc题的显著特点是“不直说”材料可能是一张风景照、一段轻音乐、一个压缩包甚至一个二维码。许多人的误区是拿到图片就盯着画面看像素其实第一步应该是看文件本身。在Windows里右键图片查看属性看备注、拍摄信息、作者等元数据有时候flag就直接写在备注里。第二步是用十六进制编辑器或Notepad类工具打开图片直接翻到文件末尾很多题目把flag以纯文本形式追加在图片数据的最后你一眼就能看见。用Linux命令行就是strings加grep的组合Windows下也可以装一个文本搜索工具几秒钟扫完所有可见字符串。4.2 LSB隐写flag藏在像素颜色的“最低位”当图片表面看起来完全正常、属性里也没有信息时十有八九是隐写。最经典的入门隐写是LSB全称Least Significant Bit也就是图片每个像素颜色值的最低二进制位。原理说通俗一点把一张图片的像素看作一排排小抽屉每个抽屉里存着RGB三个数值。改动每个数值的最后一位对颜色的影响人眼几乎分辨不出来但这一位可以拿来存信息。把一整张图片所有像素的最低比特位提出来拼在一起就能得到一串隐藏数据通常是一个文本文件或另一张图片。处理这类题我用两套工具图形化工具StegSolve可以按位平面查看通道信息命令行工具zsteg专测PNG和BMP的LSB隐写。操作起来不复杂新手如果看到题目里图片格式是PNG或BMP文件又不大先用这两个工具扫一遍。当年我第一次做“buuctf lsb”相关题目时卡在不知道要提取哪个平面后来才发现只要选红色通道绿色通道蓝色通道里的某几位就能读出flag。这种经验不做不知道做一次就记住了。4.3 音频、二维码与压缩包伪加密音频文件也是Misc的常见载体。拿到一段音频先听一遍再通过频谱视图看一遍。有些题把flag藏在音频结尾的摩斯电码里有些则直接把文本信息画在频谱图上往往切换成“频谱图”模式就能看见一串清晰的字。很多免费音频编辑软件都自带频谱显示不用非得用专业工具。压缩包题目则有两种常见坑。第一种是真加密你需要对压缩包里的文件进行密码爆破常用工具是zip爆破软件配合常见密码字典跑一遍。第二种是伪加密压缩包看起来需要密码实际上只是加密标志位被修改了这时候用十六进制编辑器找到加密标志位改回去或者直接用工具自动修复就能在无密码状态下解压。真实比赛中伪加密出现频率不低如果某道题提示“压缩包需要密码”但不给你任何线索先怀疑伪加密再考虑爆破。5. 从瞎试到有章法建立一套自己的解题流程和工具清单5.1 工具不是越多越好这几样先用熟我见过很多新手电脑里装了二十多个工具真到做题时反而不知道用哪个。入门阶段我建议你先固话这几套组合用途推荐工具涉及题型编码/解码CyberChef、随波逐流Crypto抓包改包Burp Suite Community版Web文件分析Strings、HxD十六进制编辑器Misc图片隐写StegSolve、zstegMisc网络流量分析WiresharkMisc、Web逆向入门Ghidra、CriticalReverse拿Burp Suite来说它是Web题里几乎离不开的存在。浏览器上只能提交构造好的请求而Burp Suite可以拦截每一个请求随时修改你已经在页面上选好的参数、头部、Cookie然后重新发送。很多题目里页面一提交就会被JavaScript拦下这时候绕开浏览器直接发请求反而能拿到结果。Wireshark则用来分析抓到的网络包文件。有的题目会直接给你一个.pcap或.pcapng流量包文件你要在里面追踪TCP流或者UDP流找出其中夹带的flag。这个操作不用学得很深会过滤IP、会按协议筛选、会跟踪流就可以应付大多数入门流量题。5.2 五分钟判题法拿到题目后的固定动作我现在给自己定了一个流程每次做题都照这个顺序走一遍很大程度上避免了“瞎忙三小时”的情况读题两分钟把题目描述、提示、下载链接全部看一遍不要跳过任何一个词。看是否有附件有附件就下载到本地先看文件类型、大小、后缀用strings扫一遍可见字符串。在线题目先访问页面按F12看源码、看网络请求顺手试一下页面上的按钮和输入点。判断题型Web走参数和请求方向Crypto走编码识别方向Misc走文件分析和隐写方向。如果没有头绪去提交框先试一种常见格式不一定对但能排除一部分可能性。这个流程不是万能的但它能保证在最初五分钟里覆盖掉大半“送分题”的解法。很多新手卡住的原因远非题目难而是连题目给的线索都没看全。5.3 写题解是进步最快的方式我至今仍保留一个本地文件夹里面按日期和题型存题解。每做完一道题我会把以下几个问题写清楚这个题的flag是怎么找到的、中间踩了什么坑、用了哪个工具、有没有更快的解法。别小看这几行记录复盘的收益比做新题大得多。特别是在BUUCTF上很多题目是有现实题号的比如“findkey”“sam_and_steg”“梅花香之苦寒来”这类题名你在搜索引擎里还能找到别人的解题流程。做完题再看别人的思路能发现自己漏掉的那个关键点这种“对答案”的过程效率极高。我一直坚持先独立做到卡死再去找wp参考而不是一开始就跟着别人的解题步骤走那样印象不深换一道同类型题目还是会卡。6. 给新手排查高频Bug为什么你明明看到flag了却交不上去6.1 格式、大小写、多一个字符都算错你要记住一个残酷的事实CTF平台判题是“机器判题”它只认完全匹配的那一串字符串。你看到flag了有时候却交不上去大概率是因为交的不是平台要求的那份。常见情况有题目让你提交的只是flag后面的内容而不是完整flag题目的flag前缀可能不是flag{}而是别的比如ctf{}、BUUCTF{}字母大小写不同flag中间多了换行符或空格花括号用了中文字符。这种时候把答案复制进记事本里开启“显示所有符号”逐一排查空格和换行再提交一次就能过。6.2 本地能出flag平台却交不上的原因还有一种典型情况你从下载的文件里解出了一个flag本地显示的格式明明是对的但提交失败。这可能是平台题库的flag经过了二次处理。比如题目让你从流量包里提取一个字符串提取出来后还需要反转、按一定规则拼接再套上指定的前缀。很多题的“最后一公里”就这么难不是工具跑不出来而是少了那一步变换。这时候回看题目描述就非常重要。描述里如果出现“注意”“提示”“请提交”等字眼每一个词都可能是解题线索。比如提示说“给出一段十六进制”那flag很可能不是原样提交而是先转成ASCII再提交。括号里提示“flag从大到小排列”意思就是要把提取出的内容按某种规则排序。6.3 卡题超过一小时我建议直接换思路新人特别容易犯一个错误在一道题上死磕。我也有过这种阶段一道杂项题从晚上九点做到凌晨一点越做越急最后发现只是一开始文件头判断错了方向全跑偏。后来我给自己定了一个规矩一道题如果连续一小时没有推进就立刻停下来重新读题或者先做别的题换个脑子再回来。另外BUUCTF的在线题目偶尔会遇到环境重置、页面无法访问、请求超时的情况。这种时候大概率不是你的问题是平台在线环境临时出了问题过几分钟再试就行。如果题目提供的是下载附件建议第一时间下载到本地免得环境失效后连素材都没了。养成“先下附件再慢慢看”的习惯能避免很多意外。最后分享一个小习惯把你自己做出来的每一面flag都截图存好。倒不是为了炫耀而是它能在你觉得“我是不是没天赋”的时候提醒你你是真的能从一团乱麻中找出东西来的。CTF说白了就是不断面对不确定、拆解不确定的过程第一面flag是起点也是信心的来源。现在回到BUUCTF挑一道看着最顺眼的题先把附件下载下来再说。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进