Skip to content

欢迎来到竞赛指北

本页面由ACM大神和CTF高手为大家更新

在大学里有多种多样的竞赛,这里我们为大家详细介绍计算机方向含金量比较高的一些竞赛以及其他比较热门的竞赛

ACM竞赛

如果你不知道什么是ACM,那么只要你喜欢写代码,就可以来打ACM 我总结了打ACM的一些优点:

  1. 及时反馈:因为ACM是以 问题-答案 的形式呈现的,当你知道了问题的答案,并用代码实现了,你可以立刻知道你的答案是否正确,这种及时反馈真的让人欲罢不能
  2. 确定性:这个特点也是在说编程,在计算机构建的世界里,一切都是确定的,有因便有果,你在编程中犯了错,你总能找到为什么。
  3. 近朱者赤:从实际情况观察,一般打ACM的都是大佬,能和大佬社交,真的是我们蒟蒻的荣幸
  4. 升学就业:ACM的牌子在升学(保研or考研)和就业上,确实是一个可以说道的加分项
  5. 能搞钱:ACM很多比赛只要获奖,都可以拿来申请henu的单项奖学金,竞赛加分多了,学期末的三评又能拿一笔可观的奖学金
  6. 怪好玩嘞:ACM很有比赛的感觉,一般都是即时评测,打完比赛即决出胜负,cf的rating,怎么一直在掉啊;你封榜后怎么不出题啊;你是不是背着我又WA了两发;算法竞赛就是网瘾青年,早该电电了
  7. 没有缺点:我实在想不到打ACM有什么缺点,如果你知道,可以邮件联系

ACM之路

本栏攥写时为大一新生(所以不是佬的经验),希望通过自己的 ACM 之路,帮助大家少走弯路。如果大家在过程中遇到类似问题,也能从中获得一些启发与帮助。 借用一句诗来表达本栏的目的就是:他山之石,可以攻玉

注意下文:using cf = CodeForces;using ABC = Atcoder Beginner Contest;

招新阶段

上大学前我已接触过编程,不过会的是 Java 且水平停留在洛谷入门题阶段。开学新生大会上,何佬(就是本栏上面的作者,所以要相信佬,都快来投身acm吧!)介绍了ACM实验室。因初学 Java 时便以洛谷为练习平台,故对ACM实验室有一定兴趣。然后因为网上很多人认为JAVA打ACM并不具有优势,故次日毅然决定转C++(然后现在完全不会JAVA了,悲!)。9月份也是军训时间,所以晚上速通翁恺C语言教程学会基本C语言,然后通过后续练习算法连续丝滑转C++(这俩真差不多,甚至不需要特意去学)

在招新群内,公告内说可以通过cf rating 1400+保送,然后我就想看看我是什么水平,于是注册cf,然后去打了当天的div3,然后只会一题,喜提18510名。然后就去通过群内的知识图学习了基本算法,于是就是刷题(虽然要比赛前cf还是不行,rating为1100)期间确实有点挫败感,毕竟新生打起来,真的什么也不会,招新群里又有很多人感觉什么都会一样,有一点感觉自己要寄的感觉。(其实真的不用担心,比如我当时,我都分不清到底是群里哪些是新生和老生,所以新生除非是个高中OI佬,都差不多啥也不会)。正式招新赛前的热身赛,当时是打了第五,也给我了一定自信。

12月份招新赛出乎意料拿了24级第一(虽然现在已经一堆人薄纱了),然后招新阶段结束~~~~

2025-3月份-天梯赛选拔

此时,cf分依然没啥变化(感觉不如上学期强),最近一直打牛客,rating到了1600,然后就过来打选拔赛了。 L1感觉难度都还好(为什么这么喜欢空格,感觉是最喜欢空格的比赛了),L2和L3就不太做的动了,贪了点分,第四名结束,也是到勉强到一队抱大佬大腿了。 猛猛加练,不拖佬的后退就是胜利!

2025-4月份-幽默蓝桥

预计就40-50分 其实感觉难度不高,但是OI赛制真的很炸裂 A题看错三次题,B题幽默打表猜结论,D题疑似上界少开了,剩下的题都挺简单,但是我都不确定是否是正确的,但是没有评测,debug非常的难受,于是我就写完直接溜了。(好像一堆半对)

总结:蓝桥杯对于我这种写题一堆bug的人来说,简直太不友好了。

还是好好猛猛加练备赛天梯赛吧,希望不要拖佬的后腿. codeforces的rating已经凝滞了,最近一直打ABC,一般都能到2000多名的样子, 稳步上分ing(此时rating 522,atcoder加的真的慢(不过掉的也慢)) 感觉好多次都被图论的题卡住了,一直不太想学图论,最近要猛猛写图论了,我要成为图论高手!

CTF竞赛

PWN扫盲指南

前言

二进制安全方向长期以来被视为CTF中"最难入门"的领域。新手在初次尝试了解PWN方向时,往往会先查阅Wiki上的介绍,映入眼帘的便是:

现有的 CTF Pwn 题主要以 Linux 下的用户态 Pwn 为主,因此我们通常需要在本地拥有一个 Linux 运行环境,这通常可以通过安装 Linux 虚拟机来完成,此外你也可以在物理机上安装 Linux 操作系统。

对于习惯使用Windows或Android的同学来说,这些概念确实令人摸不着头脑:Linux是什么?用户态是什么?虚拟机又是什么?继续往下看,是一系列环境搭建的说明,导航栏全是英文术语,而百度搜索的结果往往更加令人困惑。

确实,与其他方向相比,PWN的入门门槛更高。Crypto可以从古典密码开始,Misc和Web从各种工具入手,逆向工程也有清晰的定义——研究软件结构和算法的过程。唯独PWN,新手常常不知从何入手。问学长的回答也是"先学好C语言和汇编,熟悉Linux基础",或者是"按照Wiki上的教程学,有问题再来问"。虽然Wiki上的内容已经相当系统,但对于从未接触过相关概念的新手而言依然十分艰难。

实际上,PWN本身的入门难度并非不可攻克,困难之处在于理解这些陌生的抽象概念。从我现在的角度看,目前很多PWN入门教程内容已经足够清晰系统,但对于没有Linux基础的新手来说,仍然存在理解障碍。我认为最值得一读的入门教程是toka师傅的《我们对PWN都有哪些误会》,本文也是受其启发,希望为新手提供一个更系统的认知框架。

强烈建议阅读toka师傅的这篇文章

学习PWN需要的并非天赋异禀,而是坚持不懈的意志和一颗孤独的心,所以非常建议加入我们的佩珀军士孤寂之心俱乐部(bushi)。

尤其在本校,PWN几乎是一脉单传,很可能只有你一个人在学习,当你看到同级同学都去Web方向找实习挣钱时,你可能会心动而放弃PWN。任何长期学习都应以兴趣为基础,如果你发现自己对PWN已经丧失兴趣,请及时转向其他方向,以免贻误发展。

说了这么多,还没介绍PWN究竟是做什么的。简而言之:"像黑客一样攻破对方的系统"。

入门

闲话少叙,让我们谈谈如何入门。我赞同toka师傅所说的,现今的入门路径已不如从前那么系统化,但跟随前辈学习仍是必经之路。栈溢出、格式化字符串漏洞等依然是当前攻击的核心技术。这个过程会很考验耐心,必须保持高度的兴趣才能在漫长的自学过程中坚持下来。

环境搭建

CTF-Wiki上已详细描述了PWN环境搭建方法,这里我介绍一下自己使用的环境配置,仅供参考:

  • 操作系统:Ubuntu 24.04(选择自己用着顺手的即可)
  • 调试环境:tmux+pwndbg(pwndbg可将其section重定向到任意tty,实现在tmux分割的不同pane中显示不同调试信息)
  • 调试框架:pwncli(由roderickchan师傅编写的PWN调试框架,简化题目调试流程)
  • 虚拟化:Docker(使用roderickchan师傅搭建的各版本环境,内置pwndbg和pwncli)
  • 反编译工具:IDA 9.0rc1(2024年10月泄露版本,SP1也已泄露但懒得更换,且部分插件刚更新支持9.0rc1)
  • 其他工具如QEMU等可在需要时再安装。

详细环境搭建指南:https://ctf-wiki.org/pwn/linux/user-mode/environment/

迈出第一步

PWN的目标通常是想办法让程序执行system("/bin/sh")以提权。

我的入门标准是:能够理解、调试并独立编写一个ret2text题目。按这个标准衡量,入门其实并不算太难。

你需要掌握的基础知识包括:

  • 基本的C语言和汇编知识
  • C程序函数调用栈的原理
  • ELF文件格式的基本结构
  • 栈溢出的原理
  • 基础的GDB调试技能

新手可能会困惑:"我知道要学这些,但要学到什么程度?",但无需过度焦虑,CTF学习是边学边做的过程。当你能够独立完成一道入门题目时,就已经达到了阶段性目标。遇到更难的题目解不出来时,思考自己哪方面知识不足,再有针对性地补充。我们总是从实验走向实战,所学知识最终会以另一种形式反馈给自己。

相关学习资料:

进阶学习

当你理解了程序的基础调用流程,明白了如何劫持程序执行流后,接下来将面对真正的ROP(Return-Oriented Programming)技术。

入门题目可能会直接提供一个包含system("/bin/sh")的程序,但实际比赛中的题目并不会如此友善。建议继续按照Wiki上的ROP基础部分系统学习。

在ret2syscall题型中,你将了解到system函数本质上是对execve等系统调用的封装。常用的readwrite等函数也是底层系统调用的包装函数,后面学习的orw技术也基于此原理。

ret2libc题型则要求你对ELF文件结构有更深入的理解,包括PLT表、GOT表以及动态链接的原理。这类题目通常会提供一个glibc版本或Docker环境。若没有提供,则需要先利用输出函数泄露某个libc函数地址,再通过地址低位匹配合适的libc版本。可以使用LibcSearcher库进行在线查询。在断网的线下比赛中,一般会提供libc库文件;如果没有,只能通过本地libcdatabase匹配版本,并使用glibc-all-in-one查找。

当我们得知libc版本但没有库文件时,本地环境的版本可能不匹配,这时需要使用glibc-all-in-one和patchelf工具来修补ELF文件,以便在本地调试。

资源链接:

其他学习资料

以下是其他优秀师傅的入门教程,强烈推荐阅读。看雪论坛、吾爱破解等平台也有很多精品文章值得学习。

个人建议以CTF-Wiki为主要学习路径,其他师傅的博客教程作为补充。Wiki内容更系统规范,而各位师傅的博客则提供了更多实用技巧和经验分享。建议从Wiki的x86部分开始,逐步学完Linux Platform-User Mode-Exploitation-Stack Overflow-x86中的基础ROP内容,再深入学习完整的ROP技术。同时学习相关的Format StringInteger Overflow等漏洞利用方法。sandbox escape中的seccomp技术在比赛题目中也很常见。学习过程中务必在各题目平台上寻找相应难度的题目进行实践,并多参加各类新生赛和国内外CTF比赛。

补充:栈迁移技术在比赛中也很常见,但Wiki中似乎未收录。

进阶

当你已熟练掌握各种栈溢出技术,能够轻松应对x86平台的保护机制(如canary、PIE等),并深入理解libc和ELF文件结构,能够熟练patch ELF文件,掌握GDB调试流程,甚至能够手写shellcode并处理各种限制条件时,你已经可以开始探索更深层的PWN。

这里我列出了一些比赛中常见的方向

堆利用是PWN中最变化多端的领域之一,这个方向需要你深入理解glibc内存管理机制和ptmalloc2的实现细节。

开始时,建议深入剖析 glibc 的 malloc 源码,理解系统如何分配堆空间、释放堆块,以及如何管理空闲堆块(chunk)。重点关注 chunk 结构、bins(如 fastbin、smallbin、largebin)的管理机制,以及 tcache 等缓存机制。这部分内容稍显复杂,但却是堆利用的基石。建议结合 Wiki 上的 bin attack 实验,一边阅读源码一边实践。

在更高版本的堆学习过程中,你会发现利用手法从原本的fastbin attack等,逐渐被一系列名为house of xxx的技术取代,这些技术由其他师傅在比赛或实验中总结而来,Wiki 上有较为系统的记录,但仍不够全,应当多在看雪、安全客等平台和各大师傅的博客中学习。

再之后,你又会发现原本覆写钩子函数的方法也被取代,原因是2.34版本去除了hook函数,之后,主流的攻击手段转为了劫持IO_FILE调用链,这类攻击通常利用堆漏洞构造特定的内存布局,劫持控制流。

推荐资源:

异构PWN

随着IoT设备和移动平台的普及,ARM、MIPS等非x86架构的安全研究变得越来越重要。

异构架构指的是区别于常见 x86/x64 架构的系统,如 32 位的 ARMv7(通常称为 "ARM")、64 位的 ARMv8(即 aarch64)、MIPS 或 RISC-V 等。这类题目通常聚焦于栈溢出利用,技术原理与 x86 大同小异,但难点在于对异构系统的陌生感以及环境搭建的复杂性。

CTF 中 ARM & AArch64 架构下的 Pwn

多语言PWN

随着开发生态的多元化,PWN领域也不再局限于C语言程序。多语言 PWN 是当前的前沿领域。许多 PWN 选手习惯于 C 语言的漏洞利用,但在实际比赛中,其他语言的题目日益增多。例如,在 2024 年末的 CCB/CISCN 线上赛中,五道题目中有四道涉及 C++,还有一道是 VMPWN。

C++ 题目通常考察 Linux 下的异常处理机制、Vector 容器、LLVM 编译器特性等内容。

Rust安全:研究Rust的内存安全模型及其潜在缺陷

GoPWN:分析Go的内存管理、goroutine调度和interface实现中的漏洞利用点,在逆向时可使用插件来辅助恢复符号表。

  • 针对LLVM编译器后端的漏洞研究
  • 语言特定的内存管理机制漏洞分析方法
  • 跨语言交互接口(FFI)中的安全问题

这部分知识去各大论坛和师傅的博客中去补充学习,wiki上暂未收录

VMPWN

虚拟机 PWN 题目对逆向能力要求极高。这类题目通常用 C 语言实现一套自定义指令集,模拟栈、堆和指令空间等虚拟机环境。漏洞可能隐藏于指令实现逻辑或指令集设计中。

通常要对题目实现的指令逆向分析,再对指令集逆向分析 常见的洞一般是越界读写,指令参数验证不足,栈溢出等

2021 qwb中有一道挺难的vmpwn,定义了一套指令集,除解释器外又提供一个程序实现了表单

vmnote

vmpwn总结

这部分知识去各大论坛和师傅的博客中去补充学习,wiki上暂未收录

沙箱逃逸

沙箱逃逸是另一个关键方向,尤其针对 seccomp、AppArmor 或 SELinux 等限制环境。在受限条件下,往往是限制了execve等系统调用,这时就该用到上面提到的ORW(Open-Read-Write)技术,并以此获得flag。有的题目甚至把open也给禁止,这时候就该用上openat。

这部分知识在wiki上学习,去找师傅博客补充即可

Web pwn

Webpwn往往是指PHPpwn,针对PHP扩展模块的PWN,通常利用popen或exec函数来执行系统命令或反弹shell,但我还要提另一种针对网络服务的,通常是基于C/C++实现的网络服务,分析程序内部漏洞,常常需要结合Web漏洞知识。

phppwn入门调试

realword-htppd-hacker

西湖论剑-ezhttp

深入

这一部分所包含的部分技术可能并不比上一节更深,但出于部分个人原因我将他们放在这。已经到这一步,不应再根据别人的顺序学习,自己去了解各个方向,去学习自己感兴趣的。

内核PWN

内核 PWN 涉及操作系统内核(如 Linux 内核或其他系统内核)中的漏洞,常见的有内核栈溢出、Use-After-Free(UAF)、堆溢出等。这一领域是权限提升攻击中的高级部分,要求对内核机制有深刻的理解。 此类题目已经脱离了用户态,深入到内核态,聚焦于操作系统本身或其模块中的漏洞。调试内核时,通常需要配置一个合适的文件系统,推荐使用 busybox+qemu+gdb 作为调试环境,虽然wiki上的教程可能已经过时,但仍有很多参考价值。

需要理解的是,OS内核与用户态其实并无本质上的区别,都是位于物理内存上的代码+数据,但内核拥有更高的权限,有完全的硬件访问能力,运行于ring0环境(最高特权级)。

Other Malloc

这一部分是对堆内存管理的扩展学习,重点关注除了 ptmalloc 之外的其他堆内存分配器。这些分配器在不同的操作系统和环境中发挥重要作用

dlmalloc  – General purpose allocator
ptmalloc2 – glibc
jemalloc  – FreeBSD and Firefox
tcmalloc  – Google
libumem   – Solaris

自行搜索学习即可

Windows PWN

Windows PWN 侧重于 Windows 环境下的漏洞利用。虽然与 Linux PWN 有相似之处,但其系统调用、内存保护机制和异常处理有显著差异。学习了 Linux 栈溢出后,Windows PWN的学习并不会太困难。唯一需要注意的是,Windows 系统中的异常处理机制较为复杂,

建议自行搜索相关资料进行学习。

Browser

Browser PWN 专注于浏览器内核漏洞,以 Chrome V8 引擎为代表,

V8 引擎:JavaScript 执行引擎,常见漏洞包括类型混淆、内存越界等。

沙箱逃逸:利用漏洞后需突破浏览器沙箱,获取系统权限

更多自行搜索论坛/cve学习。

browser-pwn入门

VM逃逸

VM逃逸指虚拟机内程序突破管理器限制获取宿主机权限,比赛中常见的是QEMU逃逸。这部分在wiki上也有详细介绍。

这部分在wiki上也有详细介绍

qemu逃逸

QEMU 逃逸 潦草笔记

IOT安全

IoT PWN研究物联网设备的安全性,如路由器、智能家居等。通常是先获取设备固件,然后对其解包分析。初学者可以使用QEMU模拟设备环境,跟随大师傅的博客学习漏洞分析方法。

Iot从入门到入土

结语

PWN领域博大精深,其学习之路漫长且充满挑战。作为一名PWN学习者,我的技术水平有限,尚有许多二进制研究的广阔天地未曾涉足。本文所述难免挂一漏万,甚至可能存在疏漏与错误,恳请读者包容并多方参考。我由衷希望,这篇文章能为那些心怀PWN梦想、却尚未迈入其门的新手们描绘出一幅较为清晰的学习地图。

在学习过程中,理论与实践缺一不可。CTF-Wiki和各类博客为我们提供了丰富的知识源泉,而CTF比赛和实战项目则是检验所学的试金石。希望大家在钻研技术的同时,注重总结与分享,将经验传递给他人,共同推动PWN社区的繁荣。

最后,希望每一个PWN学习者都能在二进制安全中找到乐趣。

看雪2021年及其之前的PWN精华合辑

数学建模竞赛

开发中

由河南大学计算机学院和软件学院的学生/毕业生共同维护