本题基于https://learnopengl.com的综合实践程序改编而来,本仓库附带了改编后的源码
- 修改resources/textures文件夹下的砖块纹理文件,将其替换成透明的,运行程序即可看到flag(参见exp文件夹)
- 删除resources/shaders文件夹下的sprite.frag与sprite.vert这两个着色器文件,会导致所有使用这两个着色器的物体无法渲染,但是字符是使用的另一套着色器,所以此时运行程序能看到flag
- 。。。本来想了一些别的思路,但是好像没有师傅那么做(比如用纯粹的逆向)
出题人上学期学了计算机图形学,就想着出一道和图形学有点相关的题目,但是又不希望选手要学很多专业的内容,最后拼拼凑凑出了这么一题。题目出出来的时候我就在想,这道题会不会脑洞太大了?预期解是不是太简单了?选手如果想不到预期解能不能做这道题?然后就想办法平衡难度,比如我把题目名取LearnOpenGL,然后程序也没有大改,就是希望选手能搜到原始的代码,然后降低分析的难度,比如本地编译未修改的源码然后做bindiff,但是很可惜好像没有选手往这方面想。为了降低逆向的难度我编译的时候选择了debug(然后锅了,如果师傅的电脑上没装Visual Studio就会导致缺库,程序跑不起来),然后往strings里面埋了彩蛋str1ngs_1s_silver_bullet?
,可以快速定位到绘制flag的那个函数。但是最终由于函数传参的问题,在缺少pdb文件的情况下,ida是无法识别出真实的函数参数的。x,y,和缩放比例变成了一个看不出规律的大数,极大增加了逆向的难度,比如空白师傅就是卡在这里。pdb文件本来想在长时间无解的情况下作为hint放出,因为师傅们太厉害了没用上,赛后也放在这个repo里了。师傅们可以尝试一下用逆向做做。最后,我在绘制砖块的时候设置了随机一块砖块不绘制,留着是为了想看看有没有师傅能靠每次的一块砖块,把flag拼出来。但是好像也没有师傅这么做。哦说到这里,我在赛前也在期待着有没有师傅能修改随机生成砖块的代码,降低打砖块的难度(把打不动的砖块变成打得动的),或者直接全消,但是好像也没有师傅这么做。还有一点老生常谈的碎碎念,这里借用橘墨师傅的话:“不要把 Misc 学成了 Musc,每天沾沾自喜,觉得 Musc 很好玩,自己脑洞大开很牛,不要忘了 Misc 的本质是什么,Misc 说难听一点就是彻底的脑洞大开,不要坐井观天每天都只会盯着考点越来越乱的隐写、编码、套娃,这走下去最终只能走向画地为牢的下场,最终走向大家开着玩笑说的 “学 Misc 以后连工作都找不到”。Misc 本质,就是杂,既是复杂的杂,也是混杂的杂。”
这是我第一次在大型比赛里出题,有什么不足的地方请大家多多指教。