0%

实验室暑期CTF训练赛--第三、四周

由于生病一直没有写博客,在此补上
题目链接:
链接:https://pan.baidu.com/s/12jKBrLCVMHM-vx5qe-FBww
提取码:21bt

RE

game

unity游戏,我们可以先玩一下
在这里插入图片描述
游戏是控制一个白球吃分,全部吃掉一共能得到12分
题目是第13个数在哪,所以猜测需要改程序得到13分

由于unity是用C#开发,所以用dnspy
在Cheat Engine_Data\Managed文件夹中找到Assembly-CSharp.dll
这是程序的源码,用来存放C#工程
凭借经验找到的start()函数
在这里插入图片描述
在这里插入图片描述
这里是对游戏的初始化设置,我们将开始的分数改为12
在这里插入图片描述
在这里插入图片描述
编译完成之后看到
在这里插入图片描述
打开发现需要分数达到14以上才可以获得flag
在这里插入图片描述
现在保存
在这里插入图片描述
在这里插入图片描述
可以发现已经被替换了
在这里插入图片描述
再次打开游戏玩
在这里插入图片描述
可以看到初始分数已经变成了12
我们吃掉两分之后即可发现屏幕上出现了flag
在这里插入图片描述
flag是:ThEFLAGGGGGGG

really_CTF

UPX壳
在这里插入图片描述
kali脱壳
在这里插入图片描述
在这里插入图片描述
IDA打开,通过字符串搜索找到了关键函数
在这里插入图片描述
在这里插入图片描述
看样子是输入的字符串经过函数sub_401000的处理之后和字符串NUCTF{I_am_flag}比较
查看函数sub_401000
在这里插入图片描述
该程序算法:
获取输入的字符串a,将a[i]换成byte_402FF8[a[i]的ASCII码],再将处理后的a和NUCTF{I_am_flag}比较,相等即为flag

查看byte_402FF8
在这里插入图片描述
00402FF8处的byte_402FF8没有显示数据,但是往下翻00403018处却有不同寻常的字符串
这其中的地址刚好差了0x20
由于ASCII码表中第一个可以显示出来的字符的值刚好是0x20
在这里插入图片描述
所以可以设想byte_402FF8的地址与实际数组有一些偏移
由于输入的可见字符最小下标就是空格的0x20,因此byte_402FF8这个地址实际上也是真正的表地址(0x403018)-0x20=0x402ff8

1
2
3
4
5
6
7
table = '''~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! '''
s = 'NUCTF{I_am_flag}'

flag = ''
for c in s:
flag += chr(table.find(c) + 0x20)
print(flag)

flag是:PI[JX#U?=1?82=7!
(看起来奇奇怪怪哈~)

simple

IDA打开通过字符串发现特殊字符找到关键函数
在这里插入图片描述
time() 获取时间,很显然需要动态调试绕过
打开OD,搜素字符串
在这里插入图片描述
跟随过去,看到有三个跳转
在这里插入图片描述
用 nop 指令填冲三个跳转
在这里插入图片描述
直接运行,获得flag

在这里插入图片描述
flag是:flag{h4ppy520}

MISC

Least

在这里插入图片描述
使用 stegsolve 查看,这个题目名称很容易让人想到LSB
在这里插入图片描述
这里不知道为什么要用BGR,感觉遇到的这一类题目大多数不是RGB就是BGR,没有找到很好的参考资料,有懂得大佬麻烦指教一下~
保存之后foremost了一下
在这里插入图片描述
得到了一个压缩包
在这里插入图片描述
解压即可得到flag

flag是:flag{c6ed6d6318005debbca17c7b1d7096d8}