6.3日更新
5.30号到6.1号都进行了RCTF的比赛,逆向小分队,一共做出5道,差一道题ak,W&M排行第4
cipher
拿到程序后用 ghrdia 反编译一下
看到了随机数的位置,srand那么后面一定就有地方rand取出来,这里对另一个文件的时间戳进行的取的随机数,进行后,进行cipher,我们跟进去看一下
我们看到puParm2这个变量,进行随机数的一个取char类型,也就是1Byte的数据量,那么mips64架构这里是大端序,c语言是小端序,那么假设一个是 0x11 0x22 一个char key[16] ,那么就应该是0x1122000000000000,然后写脚本,这里祥哥帮了帮忙
1 | #include<stdio.h> |
在最后一次的把 m[i] < 0x20取消就好,因为有不可见的字符
go-flag
恢复一下符号表
接受字符串
send 和 recv 这两个函数是想对应的,客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答,不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据
看一下调用的chanrecv1
下断可以看到一个flag,按顺序搜集这些 main_main_func 的 flag,拼接起来即可
play_the_game
是个五子棋的游戏,我刚开始用的改之理
换 jadx 看了下发现关键点
去解一下
得到我们需要赢电脑99次,我们就可以得到flag
调用99次就可以
rust-flag
主要是一个异或:A^B^我们输入的数据
1 | data1 = [0x6b,0x56,0x76,0xb2,0xee,0x03,0xb1,0xe3,0x62,0x5c,0xe6,0x91,0x1d,0x93,0x27, 0xfc ,0x8d,0xf8,0x53,0x64] |
My Switch game
打开压缩包,有一个 nro 文件和一份 log,下载一份 loader Switch64.dll,把 nro 丢给 IDA。稍微分析一下,可以知道 sub_C20 会初始化部分游戏参数,比如蛇和果实的位置。sub_10D0 则是关键函数,会根据当前蛇的前进方向和吃到的果实数,生成下一位 flag 以及下一颗果实的位置(初始函数解密一位、前 4 个以及第 31 个果实 xor 0x44,解密出"RCTF{}")。部分伪代码如下:
1 | v9 = direct + 4 * index - 1; |
可以直接抠 rand 的代码用,设置好 seed 就行。问题在于吃到果实的时候蛇的前进方向。代码里没分析出其他信息,猜测是在 log.log 里面。在题目描述里的 github,找到了一个脚本可以解析一部分日志数据。https://github.com/mart1nro/joycontrol/blob/master/scripts/parse_capture.pyInputReport 和 OutputReport 的解析可以看这个https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/bluetooth_hid_notes.md简单解析了一下,发现 InputReport ID 大部分为 0x30,也就是包含了按键信息
OutputReport ID 大部分为 0x10,也就是 Rumble data
推测是吃到果实后,游戏会让手柄振动,那么 Rumble data 应该会大不相同。结合这几点,写个脚本解析 log,主要是解析出方向键数据以及 Rumble data,并且过滤一下没用的 Rumble data(图片中的"0001404000014040"出现得最多)。代码如下:
1 | import struct |
运行后,删除掉没有方向数据的 Rumble data 就可以分析了,这里取两条最开始的数据
1 | DDDDDDDDDDDDLLLLLLLLL |
在 Rumble data 上面的最后一个方向数据,就是吃到果实的时候蛇的方向了。第一条是 L,第二条是 U,以此类推。拿到所有方向数据后,写个脚本直接输出 flag
1 | import ctypes |