Skip to content

腾讯游戏安全竞赛2021 PC初赛

Updated: at 12:59

腾讯游戏安全竞赛2021 PC初赛复现

前言

腾讯2022的要开始了,赶紧把去年的题目做完了解一下大概的题目方向,这道题断断续续的做了好多天(有点摸了),前几天被这个程序给下到了,逆出来一个符号,给我看傻了。看了一下wp才大概理清前半部分的思路,下面简单介绍一下我做这题的心路历程,说实话有点高估题目了,但是估计就算是来做去年,我肯定也做不出来。

迷茫

先试运行一下程序,与鼠标移动方向相反不太习惯,没感觉到任何提示,不知道要干啥

Untitled

放入ida看看,什么也没看出来还是懵的。动态调一下,在return之前都没有任何反应,有点奇怪,当进入return的那个函数发现一大堆数据,还以为是进入了某个系统函数。

Untitled

上手

看了一下wp,原来是一个摄像机被锁住了视角,就像fpx游戏的镜头转动一样。分析程序的字符串部分可以得出用了OpenGL这个库来实现上述的功能,接下来就开始通过百度学习这个库

https://learnopengl-cn.github.io/01 Getting started/09 Camera/

https://blog.csdn.net/szqsdq/article/details/79584409 这个基本上是这道题的源码

这都是从其他wp里面看到的,我自己百度就找不打这些资料,找资料还需要水平(可恶)

Untitled

大致说一下OpenGL这个库的需要用到的部分:

glm::LookAt函数需要一个摄像机位置(解题点)、目标和上向量。它会创建一个观察矩阵。

可以用这个矩阵乘以任何向量来将其变换到那个坐标空间

glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f),
           glm::vec3(0.0f, 0.0f, 0.0f),
           glm::vec3(0.0f, 1.0f, 0.0f));

视角移动:

欧拉角(Euler Angle)是可以表示3D空间中任何旋转的3个值,俯仰角是描述我们如何往上或往下看的角,偏航角表示我们往左和往右看的程度。滚转角这里用不到。

于俯仰角和偏航角的方向向量

direction.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));
direction.y = sin(glm::radians(pitch));
direction.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));

在处理FPS风格摄像机的鼠标输入的时候,我们必须在最终获取方向向量之前做下面这几步:

  1. 计算鼠标距上一帧的偏移量。
  2. 把偏移量添加到摄像机的俯仰角和偏航角中。
  3. 对偏航角和俯仰角进行最大和最小值的限制。(刚开始以为这道题解题点)
  4. 计算方向向量

顿悟

原来题目当我移动到左下角的时候,在右上角箱子就已经提示我没显示完全,所以只需要找到控制摄像机位置的点是,和解除在回调函数中的视角限制就可以了。

如何找到这两个点呢?

改视角

首先说说如何找到回调函数,只需要将上面那个几乎是源码的博客中将ida的函数名一一替换就行。

Untitled

在前几个函数恢复完不久就找到了,进去看看限制在哪

Untitled

很明显的一处范围限制,直接用x32dbg把这段代码nop掉。

Untitled

运行结果

Untitled

看是看到了,只不过这位置不太对劲,感觉就是从脚下看的情况,所以不得不改摄像机位置了。

改位置

结合那个类似源码的程序,猜测glm::lookAt大致位置,再结果github里的lookAt函数如下部分

Untitled

猜测这附近就是glm::lookAt

Untitled

用x32dbg试图改一下dword_464CC4的值看看效果

Untitled

Untitled

产生了变化,注意这里改值的时候要把数据调成32位的浮点数形式,因为向量是用浮点数表示的

Untitled

浮点数与整型数据的输入的值是不同的,因为浮点数的二进制表示方式与整型数据差别比较大,直接用这个网站来转就行http://www.speedfly.cn/tools/hexconvert/

Untitled

但这个数据只能在调试的时候用,在运行状态,会被其他数据纠正。顺理成章我吗在这数据下面的那个函数中去寻找根源上的坐标位置。

Untitled

这个数据跟上面github里面的glm::lookAt函数更加相似,修改一下试试

Untitled

image-20220415205709223

成功,通过不断调整这三个数据,找到最佳的观看位置

flag:dogad