商务网站开发报告,九寨沟城乡建设官方网站,去哪个网站有客户找做标书的,wordpress 加盟主题BUUCTF Reverse/[2019红帽杯]Snake 下载解压缩后得到可执行文件#xff0c;而且有一个unity的应用程序#xff0c;应该是用unity编写的游戏 打开是一个贪吃蛇游戏 用.NET Reflector打开Assembly-CSharp.dll。#xff08;unity在打包后#xff0c;会将所有的代码打进一个Ass…BUUCTF Reverse/[2019红帽杯]Snake 下载解压缩后得到可执行文件而且有一个unity的应用程序应该是用unity编写的游戏 打开是一个贪吃蛇游戏 用.NET Reflector打开Assembly-CSharp.dll。unity在打包后会将所有的代码打进一个Assembly-CSharp.dll的文件里面通过这个文件的反编译就是详细看见里面的代码内容
一个unity引擎写的贪吃蛇游戏功能挺齐全的看代码里C#,和C都有 搜索知道unity有两个主要特点程序代码会打包进Assemblely-CSharp.dll库文件下他主要储存这文件间的相互联系与文件所包含函数其中gameobject()是用来创建对象的函数包含该函数的模块文件即为游戏的入口可以看到在Interface下
把Snake\Snake_Data\Managed目录下的Assembly-CSharp.dll放到dnSpy里面反汇编看看发现了导入外部interface动态链接库且GameObject主函数就在这个库中。
现在来看看这个函数是如何被使用的选中GameObject函数右键点击分析弹出的分析器中双击可以看出向这个函数传入了一个坐标参数。 找到Plugins下的Interface
是个用C写的64位动态链接库。
ida64查看在string窗口看到这个
查壳发现该文件为C编写不能用dnspy打开换回ida
定位是在函数GameObject中。 反编译GameObject函数这个函数的逻辑看似很复杂但是我们注意到这个函数只有一个参数a1x坐标传入传入的a1范围如果在0到99之间就能输出flag。既然是个C写的动态链接库不妨写个程序导入这个动态链接库爆破一下。
查壳发现该文件为C编写不能用dnspy打开换回ida 通过定位很容易发现主函数且刚好位于GameObject()函数下看到有几个大整数并且有两次flag提醒开始以为是RSA,但好像不是运算比较复杂师傅说可以直接调用dll函数进行爆破在函数头我们可以发现确实有一个a1参数被传入
0x02 EXP 1. exp by C:
动态调用dll 这边有个坑就是一个64位进程不能加载一个32位dll同理一个32位进程也不能加载一个64位dll。interface.dll是64位的所以我们要设置一下编译器的支持平台为64位不然LoadLibrary函数会一直返回null。 ——参考LoadLibrary加载动态库失败的可能原因以及解决方案 以vs2017为例右键点击你的解决方案进入属性。
#includeiostream
#includeWindows.h
#includedefs.h//ida自带的头文件
//函数指针
typedef signed __int64(*Dllfunc)(int);
using namespace std;
int main()
{Dllfunc GameObject;//GameObject是dll中想要调用的函数名称HINSTANCE hdll NULL;hdll LoadLibrary(TEXT(Interface.dll));//用LoadLibrary加载dll if (hdll NULL){cout 加载失败\n;}else{GameObject (Dllfunc)GetProcAddress(hdll, GameObject);//到dll中定位函数if (GameObject NULL){cout 加载函数失败\n;}else{for (int i 0; i 99; i){signed __int64 res GameObject(i);}}}FreeLibrary(hdll);//释放dllreturn 0;
}小技巧利用python内置的ctypes模块导入dll
python ctypes模块 模块ctypes是Python内建的用于调用动态链接库函数的功能模块一定程度上可以用于Python与其他语言的混合编程。由于编写动态链接库使用C/C是最常见的方式故ctypes最常用于Python与C/C混合编程之中。 flag{Ch4rp_W1th_R$} import ctypes
dll ctypes.cdll.LoadLibrary(文件路径\\Interface.dll)#导入库
for i in range(100):dll.GameObject(i)#调用库函数print(i) 学到两点
一是unity框架的定位二是dll函数的调用