[2019红帽杯]Snake
好久没上线了,长春疫情但是我的设备都在寝室,封寝来的太突然,好久没能做两道逆向,但是要备战今年国赛了.
看到大师傅BUU上一个月刷了7000分,顺序刷题不管分数, 我觉得我也得有这种精神, 一道题磕不动就继续磕!
题目本身很简单, 或者说是不难吧, 但是之前没怎么碰过U3D,也算是接触一下.
今年国赛队伍的web和misc都走掉了, 估计也碰不到邬江兴院士的可信计算, 估计国赛要三等扑街了...
这题看上去应该是一道.NET U3D, 先玩了几百分, 感觉没啥用, 没有遇到过这种类型的题, 先放在 Dnspy 里看一眼
失策了,它不是, 那翻翻DLL
在./Manage下
把CSharpAssembly扔进Dnspy, 尝试找找关键函数, 整个MainUIController实现了游戏的启动升级之类的, 但是直到无尽模式也看不到flag相关的信息
去找GameObject, 发现用到了interface这个dll, 反编译之
直接去到Gameobject里, 看看怎么达成这个you win
感觉这个地方是类似某种高精度数据结构, 我讨厌SSE, 第一个参数是Dst, 第三个参数是数字长度
A9D0这个函数就是一个数字转字符, 但是两个涉及高精度的函数还是很麻烦的. 这时候我疑惑输入在哪里.
整个函数只有一个参数传进来, 并且也是唯一参与后面运算的. 当这个参数在0~100中才能走到win, 否则有一大堆SKTEDG什么的东西, 还有7777, 玩梗大师
那么根据猜测v74里面有一个1399...的大整数, v64里第二个大整数, v71里是传入的参数
它们三个被扔进了6250这个函数, 结果应该是扔到了v67里, 6250这个函数实在不是人能分析的, 现在摆在我面前可行的路至少有两条, 一是爆破, 因为只有100个值,不会时间太长, 二是动调, 看看这个函数是干啥的, 但是后面还有一个函数AAB0需要动调, 动调本身也是个猜的过程, 我感觉时间成本太高, 还是爆破吧...
import ctypes
for i in range(0, 100) :
dll = ctypes.cdll.LoadLibrary(".\Snake_Data\Plugins\Interface.dll")
dll.GameObject(i)
# flag{Ch4rp_W1th_R$@}