首页
社区
课程
招聘
[原创]lelfei参赛题目提交:幕后之王
发表于: 2019-11-26 23:51 2195

[原创]lelfei参赛题目提交:幕后之王

2019-11-26 23:51
2195
名称:幕后之王
说明:收集关键物品,找到并打败幕后之王,获得最终胜利
预设答案:sBXI5MQArEuDiC3jbrGgEoiQ7x8w7hOog8YiiG8wwg78hYoiUbwh8ib8w7YogiihYaXilxwxRwRIYRiSwRYiigLywwYRiX8LbwRYiiOwbX8Yi4Hi

设计说明:
设计灵感来源于某手游里的一个小迷宫(看看有多少人知道这个手游?),目标是收集迷宫中的4把钥匙,并从迷宫中走出来。
迷宫一共有4层,每层有5*6个格子,每个格子的地面属性有4种:平地,洞,上楼梯,下楼梯。格子上的物品属性有4种:空,柱子,乱石堆,钥匙。
角色行动规则:角色只能在空地上通过,不能从有洞的地方通过;角色不能从石堆通过,但可以从柱子边通过;柱子可以推动,如果柱子推到洞口会掉到洞里,正好能把洞填平,可以让角色从该格通过;柱子从楼上的洞中掉下来时,会把楼下的物品砸碎。
迷宫初始化数据为:
01 11 01 00 00 -03 01 11 01 01 -03 11 21 00 00 -03 00 00 00 31
01 01 01 00 00 -00 00 00 01 00 -01 01 00 00 31 -11 00 11 00 00
00 00 01 00 01 -00 11 00 01 00 -01 00 00 00 00 -01 00 01 01 01
00 01 01 00 11 -01 00 00 00 00 -01 00 00 00 00 -00 00 00 11 00
21 00 00 01 00 -00 00 00 00 01 -00 11 01 00 01 -00 00 01 00 00
31 00 00 01 02 -00 11 01 00 02 -11 01 01 00 02 -31 01 00 00 02
数据定义:每一格的第一位是物品,0为空,1为柱子,2为石堆,3为钥匙。第二位为地面属性,0为洞,1为平地,2为上楼梯,3为下楼梯。上楼梯固定在右下角,下楼梯固定在左上角。
角色初始化位于一层的左上角,读取用户输入的指令开始行动,集齐迷宫中的4把钥匙,并通过迷宫第四层,即可获得胜利。
先把秘籍附上:(I为移动柱子,X为移动角色,注意坐标从1开始,先纵坐标再横坐标)
一楼:I(1,2)-(4,4)掉 I(4,5)-(3,3) X上
二楼:I(3,2)-(4,2)掉 I(1,3)-(5,1)砸 X下
一楼:I(4,2)-(5,2)掉 X(6,1)钥 I(3,3)-I(4,4) I(5,1)-(5,4) X上
二楼:X上
三楼:I(1,2)-(5,1)掉掉 X下
二楼:X下
一楼:I(4,4)-(4,2) I(5,1)-(5,2) I(5,4)-(3,3) X上
二楼:I(6,2)-(4,1) X下
一楼:I(5,2)-(5,1) X上
二楼:I(4,1)-(5,1) X下
一楼:I(4,2)-(5,4) I(3,3)-(4,4) X上
二楼:X上
三楼:I(5,2)-(5,4)掉 I(6,1)-(2,2) X上
四楼:I(2,3)-(1,3)砸 X下
三楼:I(1,3)-(1,4)掉 X下
二楼:I(1,4)-(1,5) I(5,4)-(1,4) X上
三楼:X(2,5)钥 X下
二楼:I(1,4)-(5,4) X上
三楼:X上
四楼:I(4,4)-(2,5)掉 X(1,5)钥 X下
三楼:X下
二楼:I(5,4)-(1,4) X上
三楼:I(2,2)-(5,1) I(2,5)-(4,1) X下
二楼:I(1,4)-(5,4) X上
三楼:X上
四楼:X(6,1)钥 X下
三楼:I(4,1)-(2,2) I(5,1)-(5,4) X上
四楼:I(2,1)-(5,5)掉 X上
为了加大难度,又定义了3个大数,前2个num1和num2从用户输入数据中取出,第3个num3固定为0x9B87A982A0380,幕后之王的血量numSum初始化为3,当收集第一把钥匙时numSum为0x37,收集第二把钥匙时numSum=num1-num2-num3,收集第三把钥匙时numSum=num1*num1-num2*num2-num3*num3,收集齐四把钥匙后numSum=num1*num1*num1-num2*num2*num2-num3*num3*num3。numSum发生变化时用numSum最低位对迷宫数据进行XOR加密。
当收集到钥匙的同时会增加角色能量值,初始化时能量值keyCount为3,每次收集到钥匙时能量值按照keyCount=((keyCount+2)//2)*3变换,即变化规律为3,6,12,21,33。
当通关时要求角色能量值与幕后之王的血量相等,即numSum=33。
为了避免多解,还计算了用户输入数据的CRC校验值,并限制输入长度为112字节以内,除去前18字节用于初始化大数,用户移动步骤只有94字节,移动柱子需要2字节,移动角色需要1字节,按通关秘籍正好一步都不能浪费,但是相同层的移动数据则可以前后交换,按上面的步骤,最多需要3072次枚举。
最后又添加了几个检测调试的函数,并“阴险”地把其中一个检测函数手工patch到程序入口位置,细心一点才能发现,希望你不要中招。
程序使用CodeBlocks设计,gcc编译,在win7x64下测试通过。

破解建议:
1.找到keyCount变换的方式,并得到大数的立方差为33,然后上网搜索出x*x*x+y*y*y+z*z*z=33的标准答案。
2.还原出迷宫数据,自己解出通关步骤或在网上找到答案。
3.组合上面二个答案,进行简单变换后即为正确通关秘籍。
个人总结:
1.移动角色或柱子需要设计自动寻路函数FindPath(),不只要找平地,还需要找下一层是柱子的洞。在这里耽搁了很长时间,最后试出了一种比较巧妙的方法:用一个数组记录找的方向,再增加一个数组记录移动过来的方向,当找完3个方向都没有路时,根据移动过来的方向返回到上一个格子继续找。
2.在计算大数乘法时,按乘法竖式从低位向高位计算,优点是只需要申请一个变量记录进位,二次小循环就搞定。
3.从开始设计这个crackme起就在断断续续的出差,时间不够了,不然会在AntiDebug方面挖更多的坑,交互提示也会更完善更友好。

文件说明:
lelfei - LastLord.rar 参赛文件
src.rar 程序源码
rnd.py 生成随机字符串序列
bb.py 根据随机字符串序列,按移动步骤生成标准答案
byteenc.py 把程序中预定义的“mov eax, 0x99999999”替换为随机花指令
readme.txt 本说明文件


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-12-30 16:40 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//