NUST南理校赛
DragonQuest
附件中有原题和Patch过后的两个Dll
这个题目难度不大,但是思路很有趣,所以分享一下~
建议先自己玩玩看~
分析
解压得到exe和dll
顺手拖入IDA,发现是.NET程序
dnspy打开发现主程序加壳了,查了一下壳无果
exeinfoPE还推荐我用RL!dePacker和QuickUnpack这两个万能脱壳机,坑爹呢这是~我还以为它觉得能脱呢,折腾了半小时研究怎么用,最后发现:不!这壳不好脱!(╯‵□′)╯︵┻━┻
于是运行了一下,发现是个打怪的游戏
查看了一下dll,发现没加壳,并且代码接近完整:
这就有两个疑点了:
- 一般如果想考察脱壳的话,没道理一个加另一个不加。(虽然如果出题人就是懒的话好像也没啥毛病
- 这个程序没必要用dll,总不能是为了复用性吧。
由这两个疑点,再加上这个题目的类型是游戏,而游戏异于CrackMe的区别在于,它的胜利方法一般是通关,即打败Monster,因此可以猜想
出题人压根没准备脱壳
解题方法为
用CheatEngine一类的作弊器干翻这个游戏
或者修改Dll从属性层面搞死Monster
CheatEngine作弊
要修改就必须通过数值查找地址,试玩了两下发现敌人只会在第一回合攻击,之后就发呆等死了
然而我方两个人物的Attack都是不破防的,完全不伤血
因此或者修改龙的防御属性,或者修改自己的攻击属性
从Dll的类中可以看到属性
//龙
this.hp = 7000;
this.mp = 0;
this.atk = 2000;
num = (num2 * 3949928697u ^ 1386209395u);
this.def = 3000;
//菜逼主角
public Druid()
{
this.hp = 60;
this.mp = 160;
this.atk = 100;
this.def = 20;
}
相对而言,100这个值较小,容易搜出很多无关的东西
于是我选择搜索少见的3000和7000
将它们分别更改成0和100后,再Attack即可
DllPatch
由于属性写在Dll中,毫无防备,因此可以直接修改静态的部分
这里还不知道计算方法是哪方先攻,所以稳妥一点的话把自己的hp/def调高一点比较好
Patch以后编译保存,替换原来的dll再运行即可
校验以后发现不知是对方先攻还是自己死就GameOver,总之第一回合硬肛是不行滴~
得用盾苟到第二回合再Attack才能拿到flag
另外还可以修改Dragon的hp,看看isDead()方法是什么时候调用的呢~
盾反!
我还没有出力你怎么就倒下了!太弱了!
后记
理论上来说应该还有第三种方法--脱壳,flag估计是明文存储在exe里的吧~所以要加壳来堵住查看方法
以往这种游戏类的题目要不是通关后通过一个很复杂的函数生成flag,要不是通关过程中解密flag,总之都是可以通过静态分析搞出flag生成函数的 (正常游玩找不到flag的不算=A=比如某Xp0int的魂斗罗真是~锁血通关了都没找到flag,好气啊)
这个加难度较高的壳的玩法挺有新意的~
可以看得出出题人还是很用心的,题目难度不高,但是很考量思路
很有趣!
如果一直硬肛这壳的话可能比赛结束都出不来吧><
PS:出题人说是dotconfuser的壳
PPS:萌新再等一个脱壳教学
PSP:出题人是不是怪物虐人厨啊/w\