题目:恶龙
题目描述:这是一个与史莱姆和恶龙战斗的故事,请战胜三头恶龙,取得flag。张三长老说,试图patch这个程序的人会得到错误的flag…

IDA64载入进入main函数

main函数会循环执行dround函数,次数是3次,次数bossexist在main函数之前的init里被初始化。outflag函数输出flag

init函数

同时被初始化的还有unief=100 coin(金钱) =5

此时outflag的一个参数flag4已经知道了。。

dround函数里面有三个选项,数字1打小怪,数字2打boss,数字3商店买东西。

小怪是随机打过的,商店store函数里可用两个金币换1战斗力

boss函数里面有判断,分别当bossexist == 3、bossexist == 2、bossexist == 1的时候并且战斗力eff高于boss的时候执行三个加密函数。而只有三次选择事件的机会,也就是说这三次事件都是2 打BOSS

看了一下加密函数的参数都是固定的,,题目描述说不可以patch会得到错误flag,大概是因为按顺序执行加密函数吧。

两个思路:一个是断点下断,然后改跳转标志位达到预期走向。

另一个就是修改战斗力eff了。

真不知道题目描述中张三长老说的话是提示还是啥,,,

战斗力eff是全局变量,随便下个断点,断下来后修改全局变量,进行byte patch

修改成ffffff7f,也就是int的最大值(小端序存放


然后连续三天都打boss,,flag就出来了。。