当前位置: 首页 > news >正文

BUUCTF Reverse/[2019红帽杯]Snake

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函数,这个函数的逻辑看似很复杂,但是我们注意到这个函数只有一个参数a1(x坐标)传入,传入的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为例,右键点击你的解决方案,进入属性。

#include<iostream>
#include<Windows.h>
#include"defs.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函数的调用

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 手拉手后端Springboot整合JWT
  • 开源可观测性平台Signoz(四)【链路监控及数据库中间件监控篇】
  • 2024年原创深度学习算法项目分享
  • HTML进阶
  • WPF 新手指引弹窗
  • Spring通信传参的方法
  • AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲
  • OpenCV-Python(22):2D直方图
  • TensorFlow Hub模型
  • 拓展操作(三) jenkins迁移到另一个机器
  • 关键字:try-catch关键字
  • Ubuntu安装WordPress并使用Nginx作为Web服务器
  • Openwrt修改Dropbear ssh root密码
  • 数据流的中位数
  • 非常好用的ocr图片文字识别技术,识别图片中的文字
  • [译]如何构建服务器端web组件,为何要构建?
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Android交互
  • Angular Elements 及其运作原理
  • Druid 在有赞的实践
  • HTTP请求重发
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JDK 6和JDK 7中的substring()方法
  • Meteor的表单提交:Form
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • spring学习第二天
  • vue脚手架vue-cli
  • webgl (原生)基础入门指南【一】
  • XML已死 ?
  • 闭包--闭包作用之保存(一)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 计算机在识别图像时“看到”了什么?
  • -- 数据结构 顺序表 --Java
  • 通过git安装npm私有模块
  • 小程序button引导用户授权
  • 一个JAVA程序员成长之路分享
  • 运行时添加log4j2的appender
  • ionic异常记录
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • #微信小程序:微信小程序常见的配置传旨
  • (2)STL算法之元素计数
  • (ros//EnvironmentVariables)ros环境变量
  • (solr系列:一)使用tomcat部署solr服务
  • (二)WCF的Binding模型
  • (二十四)Flask之flask-session组件
  • (分类)KNN算法- 参数调优
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)appium-desktop定位元素原理
  • (一)插入排序
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (正则)提取页面里的img标签
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)大道至简,职场上做人做事做管理