1cePeak

char nick[7] = "1ceP3ak";

printf("https://github.com/%s\n",nick);

printf("%s\x40icep3ak\x2e\\\bch\n",nick);

puts("5E12 9ABC C2A9 564B C048 2DF9 D327 0D10 BC71 CF75");

2020 SCTF Writeup

Jul 8, 2020 • CTF,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!