吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5643|回复: 5
收起左侧

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

[复制链接]
smallzhong 发表于 2021-4-5 08:59
本帖最后由 smallzhong 于 2021-4-8 09:23 编辑

WriteUp

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

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

    image-20210403121431218

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

    image-20210403122018810

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

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

    image-20210403122906411

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

    image-20210403122447459

    我在OD中搜索 movss xmm1, dword ptr ds:[ecx+edi*4+0x4] ,找到其位置在 406ec1 的位置

    image-20210403123020871

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

    image-20210403123404783

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

    image-20210403123559856

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

    image-20210403124402362

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

    #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

    image-20210403125020192

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

    image-20210403150602102

  • 我怀疑这道题是18年那道题改了什么东西,应该另外藏有flag,应该不会只是这么简单,但是看了二进制比较不同的地方又看不出什么端倪。。还是太菜了

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +2 收起 理由
chenkeai深蓝 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
炒酸奶 + 1 + 1 热心回复!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xiaoniba1028 发表于 2021-4-7 16:14
棒,厉害
b917893200 发表于 2021-4-10 10:31
 楼主| smallzhong 发表于 2021-4-10 19:11

入了,决赛flag也交了,挂写不出来,明天肝肝看能不能行
chenkeai深蓝 发表于 2021-6-21 17:27
不知道什么时候能学到这个地步
yunjl 发表于 2021-11-20 00:42
厉害厉害
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 17:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表