0%

2019红帽杯_snake

Windows游戏逆向。使用到了unity框架,C#直接使用dnspy查看一下。

发现没啥思路,而且是完全的陌生,于是就直接找了几个wp来研究,看完之后大有收获。

通过搜索阶段、长度、得分等关键字可以定位到关键方法。

然后就是查看这几个类,在snakehead可以找到一个和坐标相关的方法,其他的一些方法基本上根据函数名就知道函数的作用。

可以看到是从Interface调用的方法GameObject,在plugin目录有一个Interface.dll,拖入ida查看。

直接从导出函数找到GameObject。然后就是一个很难弄懂的逻辑,而且参数只有一个。但是通过定位这个关键参数

可以确定a大于等于0,小于等于99,只有这样他才会进入那个if语句,从而有可能触发下面的函数

如果我们能用c语言把这个函数复原过来,使用0~99作为参数就可以暴破出来flag。

然而,这是一个dll文件,gameobject函数作为导出函数,是可以直接被调用的。一下是调用程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <windows.h>

// 函数指针
typedef signed __int64 (*Dllfunc)(int);

int main() {
Dllfunc GameObject; // GameObject是dll中想要调用的函数名称
HINSTANCE hdll = NULL;
hdll = LoadLibrary(TEXT("Interface.dll")); // 用LoadLibrary加载dll

if (hdll == NULL) {
printf("加载失败\n");
}
else {
GameObject = (Dllfunc)GetProcAddress(hdll, "GameObject"); // 到dll中定位函数
if (GameObject == NULL) {
printf("加载函数失败\n");
}
else {
for (int i = 0; i <= 99; i++) {
signed __int64 res = GameObject(i);
}
}
}

FreeLibrary(hdll); // 释放dll
return 0;
}

有可能出现加载失败的问题,这时候可以在 调式–>调式属性,更改平台

因为这是一个64位的dll,所以我们的平台要选择x64

实现的效果就是

还有一种更为简单的调用方式:

1
2
3
4
5
import ctypes
dll = ctypes.cdll.LoadLibrary("E:\\RE\\buuctf\\Snake\\Snake_Data\\Plugins\\Interface.dll")#导入库
for i in range(100):
dll.GameObject(i)#调用库函数
print(i)

这段代码是使用Python的ctypes库加载一个名为”Interface.dll”的动态链接库,并调用其中的GameObject函数。循环100次,每次传入一个递增的整数i作为参数,并在每次调用后打印i的值。

参考链接:

https://mp.weixin.qq.com/s/MKaMMihP8gPSYKswAxjNqQ

[2019红帽杯]Snake-CSDN博客