2021腾讯游戏安全技术竞赛 初赛PC客户端writeup

前言

昨天玩脉脉有老哥建议我可以玩玩CTF,确实可以试一试,搜了一下最近的CTF,正好腾讯有一个安全技术竞赛

虽然错过了报名时间,但PC初赛赛题还是可以下载下来做的

分析了一上午,这里写一个简陋的writeup

赛题

PE信息

32位,无壳,VC++,跑起来后发现有加载OpenGL动态库

目标

程序中藏有一个以"flag"开头的字符串。要求找出该字符串

简单描述

运行起来后

  • 渲染了一个箭头,并指向右上角
  • 视角有限制,无法移出箭头的视野

做题过程

尝试解锁视角

第一感觉这个箭头是提示,指向正确的flag。但视角被卡了,所以先试试解锁视角

视角是根据鼠标的移动来移动的,熟悉Windows消息机制的话,就知道先去找窗口注册的函数,那里有WndProc函数,负责处理各种消息,当然也包括鼠标消息

IDA载入,打开Structures视图,找到WNDCLASSEXW结构体,按下X找到绑定的WndProc函数。

然后继续找到对应的鼠标移动时间的处理函数,发现确实有限制

到x32dbg里,NOP掉对应的if

OK,现在可以自由的转动视角了,但转了一圈也没发现flag,果然不可能这么简单,哈哈

但箭头右上角确实有一些奇怪的东西,貌似是一堆箱子组成的文字?这可能才是我们要的答案

静态分析渲染流程

无奈只能深入看一下OpenGL的代码细节了,之前没接触过OpenGL,顺便找了个教程对着学

  1. 设置顶点数据

一个立方体有6个面,每个面有2个三角形,所以需要2 * 3 * 6 = 36个顶点

  1. 设置贴图纹理
  1. 设置projection、view、model 3个变换矩阵并绘制界面

程序先设置好设置projection和view,而后使用循环设置model以及glDrawArrays

综上所述,我猜测这里就是在循环的回执立方体,最终形成一个箭头的形状,包括之前看到的奇怪的东西

dword_466020和dword_46601C应该是记录了三维向量表的开头和结尾

动态调试验证

到x32dbg里,我们找到渲染立方体的地方,下断

重新运行程序,方便找到向量表的开头

试试看清空数据,发现少了一些立方体

我们F4运行到循环外,发现数组长度0xBF1,也就是3057

因为每次渲染会取xyz三个float,也就是说循环的增量是i+=3,3057/3 = 1019

也就是说一共有1019个立方体

我们把这些数据提取出来,然后编写个DX9程序绘制一下即可

总结

难度不是很大,但还是需要点耐心的,特别是我这种不会OpenGL的

顺便也是学习了一些OpenGL相关知识吧,顶点、顶点缓冲对象、着色器、贴图纹理等等…