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,应该不会只是这么简单,但是看了二进制比较不同的地方又看不出什么端倪。。还是太菜了 棒,厉害 你入围了没{:301_997:} b917893200 发表于 2021-4-10 10:31
你入围了没
入了,决赛flag也交了,挂写不出来,明天肝肝看能不能行 不知道什么时候能学到这个地步 厉害厉害
页:
[1]