smallzhong 发表于 2021-4-5 08:59

2021腾讯游戏安全技术初赛wp

本帖最后由 smallzhong 于 2021-4-8 09:23 编辑

# WriteUp

+ 拿到程序之后发现这道题和2018年腾讯游戏安全竞赛决赛第一题非常像。不过使用 `Beyond Compare` 进行二进制比对之后发现有很多地方并不一样。

+ 把程序拖到OD中,发现开启了ASLR,首先使用PE工具将ASLR关闭,便于调试。

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403121431218.png)

+ 拖入IDA进行查看,可以看到 `WinMain` ,进入查看发现其中主要逻辑是通过 `ReadFile` 在自身PE文件中读取两个 `buffer` 。在OD中动态调试发现读取的两个buffer一个像是JPEG格式的文件,一个像是PNG格式的文件

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403122018810.png)

通过我写的一个od插件 https://github.com/smallzhong/ollydbg_plugin 将内存中的数据按照 `BytesToRead` 大小dump下来之后发现打不开,看了一下github上一个2018年决赛的writeup https://github.com/WindRunner97/2018gslab2 发现这两张图片要拼在一起,而且跟flag可能并没有什么关系,遂放弃。

在这个wp中看到修改视角的方法,将 `4071d7~40722b` 的jcc全部nop掉,视角可以移动了,但是并没有什么用处

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403122906411.png)

根据wp中在内存中找图的方法,

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403122447459.png)

我在OD中搜索 `movss xmm1, dword ptr ds:` ,找到其位置在 `406ec1` 的位置

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403123020871.png)

在此下断,发现 `ecx=540fe0,edi=0`

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403123404783.png)

找到相应内存地址。可以看到存储的是坐标

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403123559856.png)

通过我写的od插件,从540fe0开始将 `1019 * 4 * 3 = 12228` 个字节的数据dump下来

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403124402362.png)

然后写一个程序将其转换为数字,因为之后要用到 `matplotlib` ,因此将其转换为一个 `python` 的 `list` 。代码如下

```cpp
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

using namespace std;
#pragma warning(disable:4996)

#define FILEFATH "F:\\腾讯游戏安全\\dump.dat"

typedef struct
{
          float x;
          float y;
          float z;
}st;

int main()
{
          FILE* fp = fopen(FILEFATH, "r");
          fseek(fp, 0, SEEK_END);
          DWORD file_size = ftell(fp);
          fseek(fp, 0, SEEK_SET);

          freopen("d:\\testout.txt", "w", stdout);

          printf("list1 = [");

          for (int i = 0; i < 1019; i++)
          {
                  st t;
                  fread(&t, sizeof(st), 1, fp);
                  printf(",[%f,%f,%f]", t.x, t.y, t.z);
          }
          cout << "]";
          return 0;
}
```

最后使用如下代码,可以看到 `flag`

```python
import numpy as np
import matplotlib.pyplot as plt

list1 = , , ,
         , , ,
         , , ,
         , , ,
         ,
          ...(省略大部分数据)
          ]
fig = plt.figure()
ax1 = fig.add_subplot(111)
# 设置标题
ax1.set_title('ANSWER')
# 设置X轴标签
plt.xlabel('X')
# 设置Y轴标签
plt.ylabel('Y')
# 画散点图
for elist in list1:
      ax1.scatter(elist, elist, c='r', marker='.')
# 设置图标
plt.legend('x1')
# 显示所画的图
plt.show()
```

可以看到flag为 `dogod`

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403125020192.png)

+ 另外程序里面还有这东西。。

!(https://cdn.jsdelivr.net/gh/smallzhong/new-picgo-pic-bed@master/image-20210403150602102.png)
+ 我怀疑这道题是18年那道题改了什么东西,应该另外藏有flag,应该不会只是这么简单,但是看了二进制比较不同的地方又看不出什么端倪。。还是太菜了

xiaoniba1028 发表于 2021-4-7 16:14

棒,厉害

b917893200 发表于 2021-4-10 10:31

你入围了没{:301_997:}

smallzhong 发表于 2021-4-10 19:11

b917893200 发表于 2021-4-10 10:31
你入围了没

入了,决赛flag也交了,挂写不出来,明天肝肝看能不能行

chenkeai深蓝 发表于 2021-6-21 17:27

不知道什么时候能学到这个地步

yunjl 发表于 2021-11-20 00:42

厉害厉害
页: [1]
查看完整版本: 2021腾讯游戏安全技术初赛wp