拖入IDA进行查看,可以看到 WinMain
,进入查看发现其中主要逻辑是通过 ReadFile
在自身PE文件中读取两个 buffer
。在OD中动态调试发现读取的两个buffer一个像是JPEG格式的文件,一个像是PNG格式的文件
通过我写的一个od插件 https://github.com/smallzhong/ollydbg_plugin 将内存中的数据按照 BytesToRead
大小dump下来之后发现打不开,看了一下github上一个2018年决赛的writeup https://github.com/WindRunner97/2018gslab2 发现这两张图片要拼在一起,而且跟flag可能并没有什么关系,遂放弃。
在这个wp中看到修改视角的方法,将 4071d7~40722b
的jcc全部nop掉,视角可以移动了,但是并没有什么用处
根据wp中在内存中找图的方法,
我在OD中搜索 movss xmm1, dword ptr ds:[ecx+edi*4+0x4]
,找到其位置在 406ec1
的位置
在此下断,发现 ecx=540fe0,edi=0
找到相应内存地址。可以看到存储的是坐标
通过我写的od插件,从540fe0开始将 1019 * 4 * 3 = 12228
个字节的数据dump下来
然后写一个程序将其转换为数字,因为之后要用到 matplotlib
,因此将其转换为一个 python
的 list
。代码如下
#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
import numpy as np
import matplotlib.pyplot as plt
list1 = [37.000000, 9.000000, -6.500000], [38.000000, 9.000000, -4.100000], [39.000000, 9.000000, -5.900000],
[40.000000, 9.000000, -4.600000], [41.000000, 9.000000, -7.000000], [73.000000, 9.000000, -5.600000],
[74.000000, 9.000000, -4.200000], [75.000000, 9.000000, -6.400000], [76.000000, 9.000000, -5.600000],
[77.000000, 9.000000, -4.000000], [36.000000, 10.000000, -4.300000], [37.000000, 10.000000, -6.400000],
[38.000000, 10.000000, -4.700000],
...(省略大部分数据)
]
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[0], elist[1], c='r', marker='.')
# 设置图标
plt.legend('x1')
# 显示所画的图
plt.show()
可以看到flag为 dogod