2020 SCTF Writeup
XCTF联赛分站赛-SCTF题解
每次比赛都是本考研🐕为数不多的放松时间,真的开心
高考加油~
由于Nepnep很多师傅去实习了,所以本次参赛的师傅比较少~
Misc
sign-in
铁签到了,tg入群即可拿flag
Dou dizhu
斗地主,永远滴神,我xxx就不信你17张牌能秒了我!
地主赢了出flag,可能有卢老爷名字的加成,一手春天直接带走双开页面IDIOT的大哥~
体验很好下次还来
EasyMisc
拿到一张打不开的图片,放进winhex分析
看到图片名字和前两个字节就可以猜出是hex反序,脚本如下:
a = open('galf_si_erehw.jpg','rb').read()
f = a[::-1]
b = open('flag.jpg','wb').write(f)
之后删除中间的02垃圾数据,补全图片头部即可打开图片
成功打开之后得到一个flag字符串
继续使用Strings分析图片,可以看到有一串密文。
Maybe You are close to flag but U can’t find me~ Maybe You are close to me xoBTuw36SfH4hicvCzFD9ESj rc4,gb2312
根据提示使用CyberChef解密字符串
Can you hear
我们用接收机收到了来自空间站传来的信息, 尝试解开答案😀.
题目读到一半果断打开RX-SSTV识别wav音频(手机端使用Robot36),错失一血,拿到了三血(淦
奈何第一遍身边有杂音,第二遍识别结果就很清晰了orz
AndroidDisplayBridge
大猫师傅yyds
安卓一加6手机流量分析(国货之光
从流量分析中找到了软件scrcpy,出题人应该是用srcpy绘制了flag
adb协议分析 https://github.com/cstyan/adbDocumentation
思路就是根据wireshark的流量分析,找到带WRTE的数据包,根据里面的datalen把后面的adbdata都提取出来 全部提取出来之后根据源码里面的提示,前12个字节是metadata,头部数据去掉之后丢到ffmpeg里面。 先使用wireshark导出5555来的全部tcp流,然后脚本提取出adb协议的WRTE包数据:
from struct import unpack
f = open('phone_to_pc.bin', 'rb')
current = f.read(4)
out = open('result.bin', 'wb')
remote_id = 134
while f:
if current == b"WRTE":
arg0, arg1, data_len, data_crc32 = unpack("<IIII", f.read(16))
assert(unpack("!I", current)[0] ^ 0xffffffff == unpack("!I", f.read(4))[0]) # magic
data = f.read(data_len)
if (arg1 == remote_id):
print(data_len)
out.write(data)
current = f.read(4)
else:
current = current[1:4] + f.read(1)
因为前12个字节是metadata,所以写脚本去除
from struct import unpack
f = open('result.bin', 'rb')
f.read(64)
f.read(4)
pending = None
a = open('flag.h264', 'wb')
while True:
pts = unpack('!q', f.read(8))[0]
assert(pts == -1 or (pts & 0x8000000000000000) == 0)
pkt_len = unpack('!i', f.read(4))[0]
pkt_data = f.read(pkt_len)
if (pts == -1):
pending = pkt_data
continue
if pending is not None:
pkt_data = pending + pkt_data
pending = None
print(len(pkt_data))
a.write(pkt_data)
之后将得到的h264数据流使用ffmpeg转化为mp4
ffmpeg -i flag.h264 flag.mp4
打开视频就可以看到出题人绘制flag的操作了
PassWord Lock
大猫师傅tql,就硬看
不分析逻辑,看到在sub_80002F0里面有SCTF地方的字样重点分析,然后找到了触发SWIER这个软中断的的地址0x40010410,看到往里面写了0b10,0b100,0b100,0b1000这样的东西,也就是1,2,3,4然后居然就做出来了,
这里的关键在于理解这个函数后面的部分:
0x388的函数里面向串口寄存器写入了一个u8值,并进行了循环等待,结合ascii特征,可以认为这里在进行单字符的串口写入。
下面的0x3F0函数进去之后发现什么都没做(只是执行了空循环体),可以判断为sleep(单片机由于每条指令的执行时间是确定的,sleep可以直接用循环/nop实现)。
也就是说这里每隔一秒向软中断(EXTI)的启用配置寄存器(SWIER)写入了不同的值,解出来就分别是0b10,0b100,0b100,0b1000,由于这里存在不少规律,直接按顺序写出来当成flag去尝试了一下(不管怎么样,总共也就只有4!=24种映射方式),就成了。
SCTF{1442413}
The quieter you are, The more you can hear!