mcfx's blog - 回忆录 /category/remmmmm/ DEFCON CTF 2020 游(线上)记 /archives/288/ 2020-07-03T17:03:00+08:00 本次 DEFCON CTF,因为疫情原因,便进入了“SAFE MODE”,也就是线上举办。而为了“照顾”到所有地区的参赛者,他们也没有按照正常的时间来办,而是把整个比赛分为了四个“shift”,每个 shift 长为 8 小时,每两个 shift 之间间隔 9 小时,另外在每个 shift 开始之前,会有 1 小时的准备时间。第一个 shift 从北京时间 8 月 7 日晚 8 点开始。稍有常识的读者都能算出,主办方照顾到了所有人,让大家都有两个 shift 在凌晨。 本文为了方便描述,也使用 shift 1~4(准备时间也算入下一个 shift 中),而非之前一些文章中的 DayX,来指代大致时间。另外,为了方便描述 shift 之间,以及比赛开始前的时间,可能也会用到 shift X.5 的描述。 # shift 0.5 比赛前几天去了上海玩,这一天去逛 bw。不过由于配网的锅也丢给了我,所以就在 bw 现场配网。一边看表演一边敲命令,实在是有点草。 主办方赛前称,离他们的基础设施最近的 AWS 区域是 us-west,然而 AWS 没有叫这个的区( 于是我在 us-west-1 和 us-west-2 各开了一台,然后测试用教育网中转 openvpn。(虽然主办方给的 wireguard,但是好像他只让一个客户端连,于是我就用 openvpn 给大家中转了) 配到能用之后,用 iperf3 测了测速,能有 150Mbps,基本还行。 # shift 1 开场时,在 us-west-1 ping 主办方的 vpn endpoint,延迟高达 1ms,看来主办方的全套设施应该也都在 AWS 上吧。 这个 shift 的大多数时间都在路上跑,于是没怎么看题。 中途,刘大爷说下载文件只能 1Mpbs,于是赶紧测试了一下,发现确实如此。把 openvpn 改成 tcp 模式之后也只有 20Mpbs 左右,调了一些别的参数也没啥用,只好将就用。。 # shift 1.5 赶去和大家回合。 # shift 2 开场时,看了看 21 点和之前的某道 pwn,然后发现都不会。 不久之后,放了一道新题,pinboooll。这题给了一个 binary,里面有许多条件判断,每个条件判断通过了可以有一些加分。这些条件判断看起来确实颇有几分三维弹球的味道——有一个状态变量,类似于弹球在整个界面中的位置,当比较靠左时可以用左边的挡板弹,靠右时用右边的挡板弹;另外还有一些时候会触发任务,然后拿到一些“Jackpot”,这些 Jackpot 自然也有额外加分。 binary 最开始会要求给出一个文件名,当这个文件中的不同字符数有 5 个,就成功发射弹球。弹球的初始状态是随机的,不过种子是确定的。 但是,初始状态下,所有操作都执行不了,在研究了好久之后,我发现可以用程序不识别的操作,来避免退出,并获得每轮的加分。 继续逆了两个小时,有人发现可以用 .. 当那个文件名,不在一开始就发射。之后可以操纵一下随机数,跳出这个难受的状态。 跳出这个状态之后,(这篇文章本来是在 8 月份开始写的,但是写到这时咕了,11 月才继续写,很多细节记不清了,接下来的部分大概会简略很多)能做的事情就很多了,但是得分还是很困难。 我尝试着手动构造输入,这持续了整个 shift 的后半段,而排名一直时上时下,最后这个 shift 结束了。 # shift 2.5 继续研究这个 pinboooll。我打算写个脚本,去自动枚举得哪些分,然后构造满足条件的输入。我和大雄合作,他搞算得分的部分,我搞构造输入的部分。肝到凌晨几点时,写的差不多了。但是这时我们发现,这一坨策略好像用处并不是很大。 这个 pinboooll 里面,有一个 secret,猜中就可以得 5000 分(可能记错了,说不定是 2000),还能重复得分,也就是可以直接猜几十次,直到输入长度限制为止。leak 出这个 secret 的脚本倒是之前就写好了。但是我在写构造输入脚本的时候,是按照这个 secret 只能用一次处理的,没想到可以搞这么多分。于是这一堆可能就算是白写了(其实也没完全白写)。 最后,这个输入可以得十万多分,这是什么概念呢,shift 2 结束时最高分还只有三千多。 # shift 3 跑了 leak secret 的脚本,然后得了十万多分,这题暂时第一。实在肝不下去了,睡觉。 一觉醒来,shift 3 已经过去了一大半。此时 pinboooll 的排行榜上,最高分已经二十多万还是三十多万。继续搞了搞,没发现有啥能搞的,正巧此时有一道新题 sloootmachine,我就去凑热闹了。 这一题是一个白盒 aes,具体来说,就是选手互相写一个 aes 加密器,然后你要找出别人的加密器的 key。这题主要是刘大爷在做,我只是去划水,并且直到最后也没有成功输出。(不过我这里写的代码倒是在后面 THUCTF 出题和 TCTF 决赛用到了,这也是另外两个故事了) # shift 3.5 吃饭,划水(sloootmachine)。 # shift 4 划水(sloootmachine)。 不过没多久,这题就下了,于是去看 ropshipai。这题是去年 ropship 的加强版,这次需要写个神经网络来搞。但是他程序有明显的栈溢出。 之前看到这道题,并没有什么好的想法,这时再来看,我就研究这个栈溢出。虽然明显溢出了,但是实际上并不好利用,我搞了好久终于可以往栈上放足够长的数据并且跳过去。 rop 这部分是 M4x 在搞,然后他也调了好久,最后发现,这个程序有 seccomp,实际啥都干不了。 比赛结束,gg。 # shift 4.5 回酒店睡觉。 一觉醒来,已经两点过了,酒店都来催退房了。然后本来订的晚上的机票还 tm 被取消了,航空公司给换了个第二天的。 看到时间勉强够,买了个 3 点过的火车票,赶上了。 颓了一下午,回到了家。 CSP-S 2019 参赛记 /archives/273/ 2019-11-17T16:03:00+08:00 这次 ~~NOIP~~ CSP,借着教育部打压竞赛的~~良机~~,我得以有幸在退役后作为社会人士参加。 ### 初赛 系统崩了半小时,比较毒瘤。 ### Day 0 人工智能入土的 midterm survey 的 ddl 在临近截止时终于水完了。 ### Day 1 傻逼监考,不让带水、食物、卫生纸。开始时低估了难度(高估了自己的水平),不慌不忙的打板子。然后瞬间过 T1。然后很快过 T2。T3 一开始想偏了若干方向。最后到离结束 2 min 时才过大样例,于是三道题都没对拍。 后来发现 T3 没判 $$n=1$$。 预计得分 200~300。 ### Day 2 ~~这里隐藏了一句话,请 F12 查看~~ T1 花了半小时才打完。然后 T2 花了 1h 搞到了大概是正解,但是过不了大样例。又花了若干时间查错,还是没过大样例。还有约 1.3 h 时开始写 T3。想了个傻逼点分做法,最后勉强写完,调了十多分钟,没调出来,就直接交了。 预计得分 100~200。 ### 总结 退役选手降智严重。成功成为我 ~~NOIP 提高组~~ 分数最低的一次。不过划水也挺有意思的。 ### UPD 最终得分 488。 OI回忆录 /archives/267/ 2019-09-15T05:06:00+08:00 ### 前言 ~~9月15日凌晨2:03,离ddl还有不到22小时,我看着只字未动的线代作业(还有其他若干ddl),打开了word写情系母校……~~ 本文是因为情系母校的ddl才写的 ###正文 一开始接触到oi是初中时,那是我已经会了一些基础的编程(VB,因为我一开始想造窗口程序,然后就没有动力去学别的语言了……),而在信息技术课上听到老师讲到有这么个竞赛,我就来了兴趣,去学校开设的竞赛班上学习。当时发了一本蓝书和一本黄书,然后蓝书上的基础内容(好像)我很快就学会了,但是黄书上一个基础dp我在接下来几个月或是1~2年的时间内都没有搞懂。在初二时我用这半吊子水平去参加了noip普及组(说起来noip都没了2333),然后竟成功的拿了省并列第一(和黄轶之)。初三时学校不让参加noip提高组,于是再去参加了普及组,然后AK了。这时我也在周末来到了成都七中旁听oi讲座。记得当时学校还办过一次(?)比较大的培训。初二和初三期间,由于我的兴趣有所转移(想做点网页),于是又学了(一些极其基础的)php,然后搞了些naïve的小项目(当然vb的小项目也是有许多的(看了看一堆烂尾的项目,我原来那时就成为鸽子了吗,,,))。 很快初中毕业了,我的oi水平还是极其低下(可能提高组300分左右吧),然后这时进了七中。首先面临的挑战是夏令营,因为我从没有过住校经历。记得似乎我是把衣服从后面塞给我妈洗的。另外印象比较深还有两件事,一件是当时我正在手写一个php的博客(虽然写了前台之后就咕掉封存起来了),~~另一件是夏令营期间re0热播,然后我以此入了宅~~。夏令营之后,和我预想的一样,进了学校oi集训队。 进入高中之后的前几周是怎样度过的已经不记得了,感觉只上了一个月文化课,之后就再也没上过。一开始停课时,蔺老(教练)是支持的,然而我妈不支持,于是蔺老让我妈去和yjq妈妈等人联系,学习停课的好处,最后她终于同意了停课(她现在回想起来觉得十分正确)。接下来就是长久的机房生活了。每天除了考试、听讲座、做题,基本就没什么别的事需要干了。这时在我妈的督促下,我也开始了每天晚上跑步。然而因为雾霾~~和我太鸽~~,仅仅几天之后就几乎再也没跑过。在这段时间里,我也买了台vps,开了个博客,~~有了比较稳定的番蔷工具~~,然后经常觉得有不错的题就往博客上挂。蔺老也开设了一个公共的csdn博客,我也往上挂了几次。 很快到了noip(实际上前面所列举的事情有的可能发生在noip之后,但是记不清并且难以考证所以就这样吧),我已经忘记了当时是抱着怎样的心情参赛,以及参赛过程中发生了什么,只记得当代码下发的那一天,在科技楼404室中,chen_xun和blutrex等人测试成绩时(似乎)调试了半天。 之后发生了两件事,floj的搭建和去八十中集训。我去了八十中,而我恍惚记得似乎参与或是围观了floj的搭建,但是根据徐西岭的[oi回忆录](https://blog.csdn.net/Tangenter/article/details/78594680),以及floj最早的提交记录,这两件事似乎是同时发生的,但是因为我实在记不清,在此就把两件事分开叙述好了。(根据下文uoj上的提交时间来看,可能搭floj比较早,然后是徐西岭记错了?) 首先是八十中集训,当时和lxl和花爸爸分了一个寝室(可能是自选的),然后和他们一起去买了一堆零食,(顺便在汉堡王吃了晚饭?)。讲课的具体内容我已经记不太清,只知道讲课内容我大概有许多部分没听懂。而自习等时间我很多都咕掉,去了寝室颓废。当时还没有无限流量的手机卡,而学校不提供开放的wifi,于是我只好看之前已经下好的番。印象比较深的还有一件事,就是在这期间去uoj上[过了一道造计算机题](http://uoj.ac/submission/113627)。 接下来是搭floj。当时看到了uoj开源的消息,cx和xp(小胖=blutrex)就决定搭一个,我也跟着去一边凑热闹。当时好像因为docker的问题折腾了一段不短的时间。之后一段时间,xp又给floj增加了网页上传数据的功能和文件管理及分享的功能。 之后是在杭州学军中学举办的清华冬令营。冬令营前不久,我学了LCT,但是没有太学懂,只粗略的背了代码,会用板子,而代码的细节不记得了。在考试当天中午(如果我没记错是下午考试),我坐在床上拿手机看这LCT板子,心里想着下午应该不会考吧,于是关掉了窗口,开始午休。不幸的是,下午果真考了LCT,然后我记错了细节导致调不出来。虽然我感觉我提交答案题分数可能还不错,但还是因此没能进入面试。记得当时我还是比较沮丧,靠着最后去杭州的西溪湿地公园游玩恢复了过来。 又经过一段时间的学校集训,接下来我去了长沙雅礼中学集训。集训的内容我也已经记不清,只记得休息时间基本都在看番,以及吃了很多顿外卖。还有一件事是,当时要求每个人分享两道题,我绞尽脑汁选出了两道题分享,没想到还被评为了优秀,获得了500元现金奖励(虽然和学费比起来是九牛一毛)。 雅礼集训结束后不久便是省选。省选前去电子科大集训。当时的考试题记得有的连数据都是错的,之后也没人订正,我们只好自行造了数据挂在floj上测试。另外有趣的事情是那边的内网和七中的内网是直连的(似乎是成都教育局自行组的网)。省选的题目有两道在floj上没有,我也想不起来,而有趣的事情发生了。当day2的成绩出来时,t3除了南山同学,最高分30(我和f321dd),而南山同学50、70、100都有。甚至其中有一位女同学没有过最简单的题(普及组难度dp)。最后虽然被ns的卡出了A队,我还是以七中第一的分数进入了省队。省选过后,我也基本接过了掌管floj的大权。 省选后不久便是CTSC/APIO2017,以及清华夏令营。~~另外我在这个时期发现了hackerearth网站,做了道近似题,发现怎么这么有趣。~~CTSC和APIO期间发生的事情我已经没有什么印象,除了一个“王选的世界”,我原以为是要选出一个王来,后来才知道王选是个人。这期间还有几个讲座,然而我全都在最后排插着电源打游戏。而清华夏令营,我只记得一道打表+线性递推的题,我拿了85分,是全场最高。后来我就进了面试,然后拿到了一本约。 接下来的训练过程我也不太能记清,而这之后是NOI2017。我记得在第一天考试结束后,晚上和lxl、csz等人一起玩deeeep.io,霸榜到凌晨两三点才睡觉。还有个有趣的事情是听lxl(?)的建议去把食堂剩的大瓶可乐拿回来喝。Day2分数出了之后,我得知自己应该进队了,之后很快证实了这一点。不过似乎我当时心情也没有特别激动。之后去了清华的办公室,签了保送协议,然后妥善保存了起来。忘了是我还是蔺老通知了我家长,她倒是特别激动。 新学期,集训队作业下发了,我、wxh、yfz也于不久之后去了长郡和他们三位集训队员一起训练。当时为了进校门,我们还搞了一套长郡校服,伪装成长郡的学生。平时我们就和他们一起做训练题,然后互相交流。之后很快到了noip(可能其实是之前),然后我照常参加,拿了省并列rk1(可惜因为若干sb错误没有AK)。~~还有一个有趣的事情是,noip day0或是day1晚上,我推荐y玩ddlc。~~ 前面还有一件没有说到的事,就是集训队作业需要自己造一道题。我当时想搞一个维护单点修改区间表达式求值,然后发现不会做,只好弱化了一下,限制了括号层数。然而即使是这个弱化版我都写了几天,调了几天才完成(比未来程序改难写多了)。 接下来不久便是清华集训。Day1,我凭着乱搞拿了第一。Day2,我用乱搞AK了。然而接下来两天就不那么一帆风顺,我只拿到了大众分。不过最后我还是保持在了总分第一。清华集训之后,又是日常的训练,以及做剩下的100多道集训队作业题(ddl战士警告)。终于在ddl最后一天(?),我勉强完成了作业。 还有一个事情是会考。多加几个会考群可以在考前拿到除了第一科之外的所有答案。我凭借这一点得以勉强及格。(如果没报送,可能勉强及格就不太够了) 之后是冬令营。这次冬令营也是IOI赛制,然而这并不能挽救我因为不会乱搞也不会正解而分数大幅度下滑的颓势。不过由于清华集训,我还是成功进入了候选队。 接下来几个月,我们照常训练——考试、讨论、自行做题(候选队作业)。时间很快过去,又到了省选。省选前是惯例的集训(主办方:你不来这交钱就不给你省选资格,不过实际上似乎没有生效)。集训的前一天,我们前往电子科大打acm,成功在封榜(前?时?)AK,吊打了全场。这一次省选中,day2我原以为自己有希望AK,结果却挂了两题,最后以rk2进了省队(rk1)是wxh。值得庆幸的是,南山的同学们这次没有出现批量过题的情况。 省选之后是CTSC/APIO 2018。我因为不会计数题,以及策略错误没能进国家队。本次CTSC由于主办方的网络配置问题导致丢了代码,拿原题重考了day3。APIO我倒是正常发挥,但是因为集训队不能是正式队员,没能拿到国际金牌。 这之后经过又一段普通的训练,NOI 2018到了。由于早早就听闻这次NOI的寝室不提供插座,于是准备了一个插在空调插座上的插线板。实际到达之后,发现由于有一个大大的提供网络的自习室,这个插线板算是白带了。这个自习室被我们称作网吧。Day1,我凭着找规律和乱搞,成功AK。当晚(?),雅礼的老师发布通知称,不参加社会活动会被取消成绩,于是~~我就把他上知乎了~~,我觉得“反正你取消我这次也没啥影响,你就取消吧”,然后就直接咕掉了社会活动。Day1.5发生的事情在此就不讲了。Day2时,我觉得应该冲一冲AK,或是rank1,于是就一直搞一道题。最后没搞出来,总分很低,但还是稳进了集训队。 暑假之后的生活就变得更水了。大概每天除了学校要求的训练和集训队作业就是颓废了。集训队作业甚至都没有要求做多少题,只要去比赛签个到就行,于是这就相当于基本没事了。至于这段时间里干了什么,大概有不少工程向的东西,以及一些其他的算法竞赛和ctf比赛。如https://qani.me 就是国庆期间搞出来的第一版。很快到了noip,我去划了水,可惜没能AK。 再之后是清华北大集训。这次北大集训有不少新颖的题目类型,当然我也在这些题里面拿到了不错的分数。不过最后的没有之前的清华集训那么好,只能说是勉强排在前几。北大集训之后,又过不久就是冬令营(WC2019)。这次冬令营发生了一个大锅,集训队机房里面,选手代码被随机交换。因此我获得了3小时加时。除去打完之前代码的时间,实际还剩2个多小时(因为题目太毒瘤我实在想不到怎么做)。最后因为北大集训名次较高勉强进了队。冬令营的最后,我们去游览了广东科学中心,O做了一个上面写着wxhak等字样的纪念牌。 之后的一段时间,我也不知道我干了什么,总之最后到了退役的时刻——CTSC。我们先在首师大附中集训了两天,算是试了机。Day1考完之后,我自我感觉还不错,好像只要day2好就有机会进队了。我妈于day1晚抵达,我们一起吃了一顿涮羊肉。不幸的是,day2我终究还是被计数卡没了。我的oi生涯也就到此结束了。 ### 后记 之后的一个多个月,我基本一直在家颓着。再之后去讲了课,考了姚班,学了一个月英语(然而英语分级考试还不是只有2级)。最后来了清华,参加了毒瘤的军训。我本想在军训的结训典礼上搞一些事情,但是果然我还是搞不出事情。最后一周的学习过去了。 ~~现在是5:00整,我终于写完了(不过好像远大于字数要求了)。~~ CTS2019 退役记 /archives/261/ 2019-05-14T23:56:00+08:00 虽然来之前感觉希望不大,但还是认真打了。 ### Day0 ~~杯好重啊~~ ### Day1 看到两道计数,感觉这是要让我名正言顺的退役吧。 在看了两个小时前两题之后,没有任何想法,只好去看看 T3,然后成功的用通解得了 84 分,再加了点暴力就 94 了。 打完之后回去写了 T1 T2 的暴力,最后又盯了一会 T1 k=1 的表,实在是没找出规律。 然后就 30+64+94=188 滚粗了。不过因为 T3,排名还行,这天 rk5,总分从 rk10 变成了 rk9。 ### Day2 又看到两道计数,感觉实在是没救了。 先看了看 T1,感觉随便 ran 一 ran 都行(flag),然后就先放着了。 又看了看 T2,打算随便写个暴力看看。然后在 3h 之后终于糊完了一个 $$O(n^4|\sum|)$$,不过还是能过 200 的范围。 然后看了看 T3,发现连暴力都只会 $$6^n$$,马上跑了(虽然最后发现看漏了是树的条件,但是链的部分分也没想到好方法)。 最后又回到 T1,随便写了一坨东西,发现过不了大样例,而且差的很远,调了一会参也没用,就结束了。 最后 T1 因为写错文件名爆零了(不是少写 s,也不是 feild)(测了下数据,只有 15 分),T2 拿到了应有的 50,一共 50,成功退役。rk9 -> rk11(T1 不写错文件名大概也就前进一位吧)。 ### 咕咕咕 其实这个结果也早就料到了,所以倒也没什么感觉了。。 ~~不用背英文自我介绍了~~ ~~回忆录什么的可能会有的,不过咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕~~ WC2019 退役记 /archives/256/ 2018-12-03T19:11:00+08:00 ~~占坑~~ 退役失败 CTSC2018 退役记 /archives/252/ 2018-05-02T16:18:00+08:00 占坑 ~~退役成功了一半了,接下来就看noi了~~ UPD:noi也退役失败 WC2018 退役记 /archives/245/ 2018-01-12T21:00:00+08:00 ~~占坑~~ 果然考炸了 然而退役失败 NOIP2017 退役记 /archives/243/ 2017-11-10T22:53:00+08:00 ~~占坑~~ 退役失败.jpg SCOI 2017 酱油记 /archives/198/ 2017-04-09T20:32:00+08:00 省选终于考完了啊。。 Day1: 先用10分钟浏览了一遍题 看了看t1,感觉贪心好像是对的啊,写了个堆搞一搞 再看t2,最近点似乎可以用点分,再加个树剖维护第一个未签到点,于是码码码,码完3.5h了 一看t3,卧槽计算几何啊。。写了发暴力。然后想到一个n^2sqrt的kd树做法,后来没调出来 最后230 Day2: 又先用10分钟浏览了一遍题 t1切了 t2是两道题加起来的,都可以O(n),然而我都只会nlog,于是T了40 t3写了一个能过大样例的n^2log暴力,但最后只得了10分。。orz 最后170 总分400,似乎挺靠前的