GUET梦极光杯(校赛)线上 RE部分wp
RE
猜
ida打开,直接看到flag
.class
.class文件用jd.gui打开,定位到关键加密代码,逻辑是个简单的异或0x17,写个脚本解出
脚本:
汇编
分析汇编代码,分析逻辑是从栈顶每次取一个字节与ecx进行异或,ecx从1开始,每次加1,当ecx = 28时加密结束,即push进去的每个字节都进行了异或加密,写个脚本
脚本:
注意把push进去的值按后进先出排序,并且因为程序是小端序的原因把每个DWORD数据进行倒序。
Easy_Maze
ida32位打开,发现无法F5反编译
仔细观察发现,因为406B51处的代码 call的操作数是一个非法地址,分析上面代码的逻辑,发现程序不可能跳转到406B51处,程序只会跳转到406B52处,故406B51处的代码是花指令,干扰了ida的反编译,我们在406B51处按 U(取消数据类型定义),
发现406B51处的数据为 0E8h 这是call指令的汇编代码,这条指令是常见的花指令,让ida以为要调用一个函数,造成反汇编失败,所以反编译更不能成功,我们把这个数据 NOP 掉,
然后在main函数上按 U,
再按 P(定义该段代码处为函数),
看到红色的部分就消失了,这时候我们就可以F5反编译了,
简单查看分析后,可以看出**sub_401360()**为走迷宫函数,进去看看,
**dword_407000[]**里面保存的就是迷宫图了,转换成c语言数组复制出来,处理一下,
如图 X 是原本的 0,遇到 X 一直走到底,直到不是 X,不能超出上下左右四个边界,最后在12步到达 002 处,这12步的迷宫走法就是flag
总结
比赛的时候Easy_Maze没做出来,ida无法F5就束手无策了,虽然也有用动态调试,但是没有冷静分析汇编来理解程序的执行,本来可以通过动态调试获得迷宫地图,但是实际情况是像无头苍蝇一样的调试,根本原因就一个——还是太菜了,简简单单的反调试花指令都搞不定,之前遇到这种题的时候都是略过,导致自己对反反调试方法一无所知,简单的分析也做不到,感觉最近需要恶补一下反反调试的知识了。