春日生活打卡季#
CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了目前全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯” 。
CTF是一种流行的信息安全竞赛形式,其英文名可直译为“夺得Flag”,也可意译为“夺旗赛”。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数。为了方便称呼,我们把这样的内容称之为“Flag”。
CTF竞赛模式具体分为以下三类:
1、解题模式(Jeopardy)
在解题模式CTF赛制中,参赛队伍可以通过互联网或者现场网络参与,这种模式的CTF竞赛与ACM编程竞赛、信息学奥赛比较类似,以解决网络安全技术挑战题目的分值和时间来排名,通常用于在线选拔赛。题目主要包含逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等类别。
2、攻防模式(Attack-Defense)
在攻防模式CTF赛制中,参赛队伍在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手服务来得分,修补自身服务漏洞进行防御来避免丢分。攻防模式CTF赛制可以实时通过得分反映出比赛情况,最终也以得分直接分出胜负,是一种竞争激烈,具有很强观赏性和高度透明性的网络安全赛制。在这种赛制中,不仅仅是比参赛队员的智力和技术,也比体力(因为比赛一般都会持续48小时及以上),同时也比团队之间的分工配合与合作。
3、混合模式(Mix)
结合了解题模式与攻防模式的CTF赛制,比如参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最终以得分高低分出胜负。采用混合模式CTF赛制的典型代表如iCTF国际CTF竞赛。
PWN(溢出):PWN在黑客俚语中代表着攻破,取得权限,在CTF比赛中它代表着溢出类的题目,其中常见类型溢出漏洞有栈溢出、堆溢出。在CTF比赛中,线上比赛会有,但是比例不会太重,进入线下比赛,逆向和溢出则是战队实力的关键。主要考察参数选手漏洞挖掘和利用能力。
MISC(安全杂项):全称Miscellaneous。题目涉及流量分析、电子取证、人肉搜索、数据分析、大数据统计等等,覆盖面比较广。我们平时看到的社工类题目;给你一个流量包让你分析的题目;取证分析题目,都属于这类题目。主要考查参赛选手的各种基础综合知识,考察范围比较广。
CRYPTO(密码学):全称Cryptography。题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术。实验吧“角斗场”中,这样的题目汇集的最多。这部分主要考查参赛选手密码学相关知识点。
WEB(web类):WEB应用在今天越来越广泛,也是CTF夺旗竞赛中的主要题型,题目涉及到常见的Web漏洞,诸如注入、XSS、文件包含、代码审计、上传等漏洞。这些题目都不是简单的注入、上传题目,至少会有一层的安全过滤,需要选手想办法绕过。且Web题目是国内比较多也是大家比较喜欢的题目。因为大多数人开始安全都是从web日站开始的。
REVERSE(逆向):全称reverse。题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译扎实功底。需要掌握汇编,堆栈、寄存器方面的知识。有好的逻辑思维能力。主要考查参赛选手的逆向分析能力。此类题目也是线下比赛的考察重点。
PPC(编程类):全称Professionally Program Coder。题目涉及到程序编写、编程算法实现。算法的逆向编写,批量处理等,有时候用编程去处理问题,会方便的多。当然PPC相比ACM来说,还是较为容易的。至于编程语言嘛,推荐使用Python来尝试。这部分主要考察选手的快速编程能力。
STEGA(隐写):全称Steganography。隐写术是我开始接触CTF觉得比较神奇的一类,知道这个东西的时候感觉好神奇啊,黑客们真是聪明。题目的Flag会隐藏到图片、音频、视频等各类数据载体中供参赛选手获取。载体就是图片、音频、视频等,可能是修改了这些载体来隐藏flag,也可能将flag隐藏在这些载体的二进制空白位置。有时候需要你侦探精神足够的强,才能发现。此类题目主要考查参赛选手的对各种隐写工具、隐写算法的熟悉程度。实验吧“角斗场”的隐写题目在我看来是比较全的,以上说到的都有涵盖。新手盆友们可以去了解下。
方向A:PWN+Reserver+Crypto随机搭配
方向B:Web+Misc组合
Misc所有人都可以做
推荐图书:
A方向:
B方向:
所周知,名校自主招生一直是学生和家长重点关注的升学捷径,作为自主招生中最吃香的学科奥林匹克竞赛,多年来一直是很多学生开启名牌大学之门的另一把钥匙。
近几年来,学科竞赛中相对冷门的赛事——信息学奥赛,正在受到学校、学生和家长的更多青睐。
那么究竟什么是信息学奥赛?参加信息学奥赛有哪些好处?信息学奥赛都考些什么?可能很多家长对此仍然有很多疑问。浩天教育就带大家一起来了解一下。
信息学奥赛是全国中学生学科奥林匹克“五大学科竞赛”中的一门,其他四个学科为数学、物理、化学、生物学,学科奥赛是由国家认可的权威性比赛。信息学,主要是指利用计算机及其程序设计来分析和解决问题的学问。信息学奥赛由中国计算机学会主办,主要考察信息学,即编程的相关知识和能力,主要包括三级赛事:
NOI的官方网站为http://www.noi.cn/。
作为理科五大学科竞赛之一,信息学的认可度和含金量极高,最直接的好处就是有助于升学,无论是小升初、中考、高考、海外留学,还是申请奖学金、保送研究生,获得信息学奥赛的好成绩都会有重要的助力作用。
① 升学择优录取
信息学奥赛获奖可以享受名牌大学降分录取等优惠,初中阶段参加NOIP获奖也可作为特长生被重点高中录取。
② 参加自主招生
省级奖项可以有资格参加多数重点大学的自主招生。
③ 名牌大学保送
获得NOI奖牌的选手可以直接保送清华北大等一流名校。
④ 当地学校录取分数线降低
部分省市NOIP普及组和提高组其他名次可以享受当地学校降低分数线录取。
⑤ 增强出国留学竞争力
奥赛获奖对申请国外院校也大有帮助,国际竞赛获奖可国外知名大学录取,美国、英国、德国、新加坡、日本等发达国家对计算机教育普遍重视,认为奥赛获奖学生的抽象概括和逻辑思维能力远远强于其他学生。
所以信息学奥赛是帮助孩子圆名校之梦的一个较好选择。
信息学竞赛能给孩子带来逻辑思维能力、知识结构和学习能力的巨大提升,学习竞赛的过程对于学生的锻炼远比学到的知识重要。经过信息学竞赛锤炼的孩子,其思维的深度及思考问题的能力更强,更具备在具体学科钻研和探究的能力。
在人工智能时代,编程或许将成为像开车一样基本的技能,提前具备信息学知识和编程能力,可以更好地面对即将到来的智能时代。在中国12类紧缺人才中,排在第一位的就是“电子信息类”。当前人工智能相关行业发展如火如荼,人才需求火爆,包括谷歌、阿里、百度、Facebook在内的巨头企业以及人工智能领域的创新先锋都在疯抢信息学人才,甚至开出百万年薪,而这种红利期还仅仅是刚开始。所以信息学奥赛不仅能提供一块不错的升学敲门砖,还可以对孩子整个人生轨迹产生积极影响。
2018年初教育部公布高中新课标,将信息学竞赛必学内容纳入了必修和选修的范畴,更是将“数据和计算”列为必修,提出了“学会一种编程语言”的要求,编程普遍进入高考或许只是时间问题。
信息学奥赛当前最突出的现状为:由于信息学不是中学阶段的关键学科,家长的认知率仍然不高,有些家长甚至都没有听说过。所以竞赛参与人数相对少,且获奖比例较高,因此竞争相对不激烈。另外,信息学奥赛还有“比赛多、机会多”的特点,只要有一次考得好,就有机会获得高校“直接录取”、“降一本线录取”、“降分录取”等相关优惠政策。下面是八大名校在信息学奥赛方面的自招优惠政策。
另外,信息学竞赛的报考情况在全国各省份很不均衡。以全国2018年NOIP提高组竞赛省一等奖分数线为例,浙江为375分,而河南只有275分,差距有一百分之巨。所以,对于信息学奥赛普及率较低的省份,学生的获奖机会也更高。
信息学相比于其他四门学科有着明显的优势。
首先是难度。五大学科竞赛中,数学和物理奥赛都太“难”,北京数学奥赛金牌教练汪老师曾表示:只有不到5%的学生适合学奥数,其很大程度是拼天赋;而物理则需要学生具备浓厚的兴趣和探索精神,而且动辄百万的报考人数也使难度攀升。化学和生物奥赛一定程度上是考知识积累,由于专业就业较难,已日趋边缘化。
信息学奥赛则相对容易一些,有初一的数学基础就完全可以学习,而且学生基础水平相当,成绩不会有较大差别,所以越早接触信息学越容易出好成绩,而且只要肯下功夫,多半孩子都能拿奖。相比其他学科,信息学是目前发挥个人潜力最广,发展空间最大,专业选择面最全的课程。
第二是竞争压力小。虽然近年来报考人数不断攀升,但与全国数百万学习“奥数”的中小学生相比,2018年全国参加信息学奥赛的考生仅为15 万,形成强烈的反差。以辽宁省为例,数学奥赛每年5万人左右参加,而信息学奥赛报考人数只有不到3000人。由于参赛人数上差异大,信息学奥赛在部分省份获奖率甚至超数学奥赛十数倍。
从中可以看出,NOIP信息学一等奖获奖人数在2017年就已接近一等奖总人数的三成。
信息学竞赛主要分为NOIP(全国青少年信息学奥林匹克联赛/分区联赛)、NOI(全国青少年信息学奥林匹克竞赛)、冬令营、选拔赛、IOI(国际信息学奥林匹克竞赛)这几个级别的比赛,竞赛的层级次序如图:
NOIP虽然为信息学奥赛的第一站,但其实优秀的获奖者已经有被名校录取的资格了。比如,今年有3个NOIP高于400分的初中生被清华提前录取,十几个被北大提前录取(只要高考过一本线即可)。
国家范围内的NOI竞赛,除了省选选手,每个省也会分配一些非正式参赛选手,不参与评奖,但会发成绩证书,也能够现场和大学签约。总体来看,签约有越来越多、年龄越来越小的趋势。
另外,一些城市也会组织区级赛(如海淀区信息学奥赛)和市级赛(如北京市小学生信息学科普日),有志于在奥赛获奖的孩子可以提前感受考试。
下图是信息学奥赛的竞赛时间表:
由此可见,信息学奥赛有三个特点:比赛流程较长,前后持续两整年;赛事较多,层级不断提升;机会多,只要有一次发挥较好,就有机会享受大学录取优惠。
信息学奥赛主要考的运用计算机分析问题、设计算法以及上机编程、调试程序的能力。其中对C++的掌握能力是核心,信息学奥赛首先需要学习的就是C++。
具体来看,NOIP初试形式为笔试,侧重考察学生计算机和编程基础知识。复试形式为机考,侧重考察学生对问题的分析理解能力、数学抽象能力、驾驭编程语言的能力及编程技巧、想象力和创造性。信息学考试的特点和魅力,在于每一次做题都是在“设计”,而不仅仅是被动的测试和做答,每个问题都有实际意义。对于孩子解决问题能力的提高,是其他科目都无法相提并论的。
目前NOIP可以使用C、C++和Pascal三种编程语言,而2022年后,NOIP比赛中C和Pascal语言将不再可用,只能使用C++。所以,学信息学,很大程度上就是学习C++。
如果没有竞赛这个前提,编程是谁都可以学的。但是如果是竞赛,肯定对学生有一定要求。首先需要对计算机感兴趣,兴趣是最好的老师,沉浸其中的孩子总会坚持下去;再就是本来成绩较好、知识全面发展的学生更适合学习信息学,因为竞赛初衷是让学有余力的学生拓展学习领域,因为信息学现在不属于学校教育的科目,如果文化课本身不好,很难花时间学习另一门新的学科。有自控力的孩子也更适合,能坐得住,静下心来学习是重要基础,因为信息学学习需要付出心血和汗水。较强的逻辑思维能力虽然不是学习信息学的基石,但会是获奖的重要元素。
首先是何时开始学习及从什么学起的问题。五年级以下的孩子可以从Scratch学起,早点接触编程,培养对计算思维和编程的兴趣。5-6年级开始学习C++,这时相对复杂的数学和逻辑问题可以更好地理解,并且可以尝试参加NOIP普及组的竞赛,为将来取得更好的成绩积累经验。
由于获得大学保送只有高一、高二才有机会,因此在初中阶段一定要参加NOIP普及组并尽早参与到提高组比赛,以积累实战经验,如果初中阶段竞赛获奖,也有助于进入重点高中。另外,有一些省份是允许初中生同年同时参加普及组和提高组比赛。下图是准备信息学奥赛的时间节奏:
根据历年获奖选手可以看出,最后获奖的都是很早就开始学习编程的孩子,而且他们每年的排名都在慢慢地往前。
信息学奥赛没有年龄限制,也就是小学、初中、高中阶段的学生都可以报名参加NOIP赛事。初赛一般都是以学校为单位通过指导教师报名(每年9月份开始报名),由指导教师汇总本校学校报名情况并提交给NOI各省特派员,若学校因故不能统一报名,家长可直接联系特派员报名(各省特派员的联络方式请见http://www.noi.cn/newsview.html?id=81&hash=C6F26A&type=9),由省特派员在报名截止日期前统一提交至中国计算机学会(CCF)。其中NOIP初赛时间是每年10月份,复赛为每年11月份。通过NOIP初赛的考生可以在10月末报名复赛。
由于没有年龄限制,所以如果孩子从小学开始进行编程培训,并开始参加信息学奥赛,那么这将是无比领先的起点优势。
零)
2024年4月21日,IOI第33届全球冠军、ICPC全球总决赛第45届冠军&第46届亚军MIT队的队员邓明扬在知乎上分享他退役前的参加的第46届ICPC全球总决赛的过程和心得。
首先恭喜北大!个人觉得这个结果还挺好。国内有许多热爱算法竞赛的人们,聪明努力而强大的jls更是很多人的偶像。北大夺冠会为人们带来很多鼓舞吧。
只是我有点对不起队友。我来讲讲MIT是怎么输的(笑)。整个故事有一种沙雕番剧里反派强行降智的幽默。
MIT由谦子,Anton和我构成。谦子是天才般的选手,兼具观察力、代码实力和乱搞天赋。和谦子组队非常幸福。Anton很聪明。虽然他不那么擅长写代码,但是经常做出深刻而智慧的观察。并且Anton真的很想赢。
前三个小时一切都很顺利。在交换了观察后,谦子轻松通过了R和X。看榜已经领先了三个题,我心中觉得比赛已经失去了悬念,于是开始了表演。下面是我做的事情。
1. 我发现Z有一个暴力做法。虽然不知道对不对,但我决定写一下帮出题人验一下数据。交上去T了,证明数据还挺强!
2. 还有一小时二十分钟左右Anton提出了完整的S做法,代码只有二十行。我听完觉得很对,认为一下子就能通过,甚至不过也能赢。
Anton很聪明,但并不擅长写代码。可这是我们最后一次比赛了,为了让Anton爽一爽,我决定扔给Anton来写。
3. Anton的S顺利写完了,交上去,WA。
由于做法听着就很对,我相信只是Anton写错了一点。于是我安排大家大眼瞪小眼看了半天,盯出了二十行代码的好几个错,改了几发还是WA。我觉得很有趣,然后接着盯着看。时间流逝了四十分钟,我没看出来更多的bug,但没有任何危机感。最后二十分钟谦子提醒大家要不写个对拍,但被我抢去瞎改代码没有写完。
赛后我发现代码只差了一个很小的case(过去的人数可以小于c),改了一行就过了,且对拍一下就能拍出来。
4. 所以诚实地讲,如果我没有在优势心理下带全队开浪,MIT写个对拍是很容易赢的。我通过努力,成功地将前半场一小时狂写300行代码的MIT,变成了一小时调30行代码都调不明白的MIT。大家庆祝的时候可以多拷打一下我。但希望大家记住谦子和Anton啊:他们是世界冠军级别的选手,只是遇到了世界冠军级别的战犯队友。
打完WF就正式退役了,希望队友能有光明的未来/得偿所愿。对不起啊。
过几天会把我的比赛策略发在知乎。根据和国内网友的交流,我觉得这个策略领先了时代几个版本。
我很喜欢国内的选手们。他们勤奋,有梦想,真的很热爱算法竞赛。希望这个策略能为他们带来帮助。我想多看他们赢几次,别再因为策略问题输给毛子了(划
(壹)
邓明扬最后提到的“毛子”,指的就是俄罗斯队伍。俄罗斯队伍,在国际青少年信息学奥林匹克竞赛(IOI)和大学生程序设计竞赛(ICPC)全球总决赛上,表现都很抢眼。尤其是在ICPC全球总决赛上,堪称一骑绝尘。比如上周在埃及合办举行的第46届和第47届的ICPC全球总决赛,北大队获得了第46届的冠军,俄罗斯国立研究型高等经济大学获得了第47届的冠军。
这两届总共有24支队伍获得了奖牌(每届12支队伍),中国大陆占了6席,即四分之一;俄罗斯占了4席。但是中国大陆的金牌数是2枚,俄罗斯的金牌数是3枚。整体感觉两个国家差不多。但是在ICPC四十八年的历史上,俄罗斯的表现比中国更好一些。
(贰)
国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC)是世界上规模最大、水平最高的国际大学生程序设计竞赛之一。ICPC由美国计算机协会(Association for Computing Machinery,简称ACM)于1970年发起组织,至今已有五十余年的历史。该赛事旨在展示大学生的创新能力、团队精神以及在压力下编写程序、分析和解决问题的能力。
ICPC赛事由各大洲区域赛(Regional Contests)和全球总决赛(World Finals)两个主要阶段组成。每个赛季持续时间约9个月,来自全球六大洲、超过100个国家和地区的两千余所高校的近五万名大学生参与该项赛事。区域赛通常在上一年的9月至12月举行,而全球总决赛则安排在每年的3月至5月。
ICPC竞赛的历史可以上溯到 1970 年,当时在美国德克萨斯 A&M 大学举办了首届比赛。作为一种全新的发现和培养计算机科学顶尖学生的方式,竞赛很快得到美国和加拿大各大学的积极响应。1977 年,在 ACM 计算机科学会议期间举办了首次总决赛,并演变成为目前的一年一届的多国参与的国际性比赛。迄今已经举办了34届。
最初几届比赛的参赛队伍主要来自美国和加拿大,后来逐渐发展成为一项世界范围内的竞赛。特别是自 1997 年 IBM 开始赞助赛事之后,赛事规模增长迅速。1997 年,总共有来自 560 所大学的 840 支队伍参加比赛。而到了 2004 年,这一数字迅速增加到 840 所大学的 4109 支队伍并以每年 10-20% 的速度在增长。
在赛事的早期,冠军多为美国和加拿大的大学获得。而进入 1990 年代后期以来, 俄罗斯和其它一些东欧国家的大学连夺数次冠军。2000年之后,中国也有一些大学获得了ICPC的冠军。赛事的竞争格局已经由最初的北美大学一枝独秀演变成目前的亚欧对抗的局面。ICPC竞赛已经成为全球最具影响力的大学生计算机竞赛,被誉为计算机软件领域的奥林匹克竞赛。不论是区域赛还是总决赛,ICPC都一直受到国际各知名大学的重视,并受到全世界各著名计算机公司的高度关注。
(叁)
ICPC(国际大学生程序设计竞赛)全球总决赛自1977年起举办,除了2020年因疫情没有举办外,到今年已经成功举办了47届。以下是历届ICPC全球总决赛冠军名单。
从统计表格中可以看出来,夺冠次数最多的国家是美国,共有18次,包含了最初13届的冠军,这与最初参加比赛的国家数量较少有关系。夺冠次数第二多的国家是俄罗斯,共有16次。夺冠次数第三多的国家是中国。
考虑到最初几届参加的国家数量很少,所以俄罗斯实质上是ICPC最强的国家。这从夺冠学校分布也可以看出来。
夺冠次数最多的高校是圣彼得堡国立信息技术、机械与光学大学,共7次夺冠。夺冠次数第二多的高校是圣彼得堡国立大学,共4次夺冠。
夺冠次数第三多的高校是上海交通大学和斯坦福大学,各3次。
夺冠两次的高校有6所:华沙大学、华盛顿大学圣路易斯分校、滑铁卢大学、加州理工学院、麻省理工学院、莫斯科国立大学。
还有18所高校获得过一次冠军,分别是北大、奥塔哥大学、贝勒大学、布拉格查理大学、俄罗斯国立研究型高等经济大学、弗莱堡大学、哈佛大学、哈维玛德大学、加州大学伯克利分校、加州大学洛杉矶分校、密苏里罗拉大学、密歇根州立大学、墨尔本大学、内部拉斯加大学、萨拉托夫国立大学、下诺夫哥罗德大学、约翰霍普金斯大学和浙大。
(肆)
俄罗斯在ICPC竞赛中表现出色,主要有以下几个原因。
首先是政府和高校的支持。俄罗斯政府和高校对算法竞赛的重视程度也很高。他们积极组织各类算法竞赛和培训活动,为学生提供广阔的实践舞台。同时,俄罗斯还通过引进和培养高水平的教练和专家,不断提升参赛队伍的整体水平。
其次是早期培养。俄罗斯对于有才华的年轻程序员的培养往往从中小学阶段就开始了。许多学生通过参加信息学奥林匹克竞赛等活动,早早地展现出在计算机科学领域的潜力和兴趣。俄罗斯青少年信息学奥林匹克竞赛(RusOI)分为五个级别:校级、市级、地区级、联邦级、国家级。通过层层选拔出来的青少年选手,到了大学就很容易做到更进一层楼。
第三是教育体系和文化。俄罗斯有着深厚的数学和科学教育传统,学生从小就接受严格的数学和逻辑训练。这种教育体系为学生日后在算法和编程领域的深入学习和竞赛打下了坚实的基础。
第四是俄罗斯的大学和中学普遍鼓励学生参与各类编程竞赛,提供了良好的竞赛环境和训练体系。这种环境促使学生在竞赛中不断提高自己的技能。
第五是人才的集中培养。俄罗斯的一些大学在计算机和数学领域有特招政策,集中培养有才华的学生,这种集中培养的策略有助于在国际竞赛中取得好成绩。
最后是成功的经验和传统。俄罗斯在ICPC等国际编程竞赛中屡获佳绩,这种成功的经验被传承下来,形成了一种积极向上的竞赛文化,激励着新一代的参赛者。
参考资料:
【1】ICPC官方网站
https://icpc.global/
【2】第46届ICPC Final分数榜
https://scoreboard.icpc.global/46/index.html
【3】第47届ICPC Final分数榜
https://scoreboard.icpc.global/47/index.html
【4】邓明扬在知乎上对第46届ICPC全球总决赛做的总结
https://www.zhihu.com/aria/question/653053550
【5】俄罗斯全国信息学奥林匹克竞赛介绍
https://ioinformatics.org/journal/INFOL017.pdf
*请认真填写需求信息,我们会在24小时内与您取得联系。