RE

ida打开,直接看到flag

img

.class

.class文件用jd.gui打开,定位到关键加密代码,逻辑是个简单的异或0x17,写个脚本解出

image-20211117160721216

脚本:

img

汇编

分析汇编代码,分析逻辑是从栈顶每次取一个字节与ecx进行异或,ecx从1开始,每次加1,当ecx = 28时加密结束,即push进去的每个字节都进行了异或加密,写个脚本

img

脚本:

img

注意把push进去的值按后进先出排序,并且因为程序是小端序的原因把每个DWORD数据进行倒序。

Easy_Maze

ida32位打开,发现无法F5反编译

Screenshot 2021-11-17 154459

仔细观察发现,因为406B51处的代码 call的操作数是一个非法地址,分析上面代码的逻辑,发现程序不可能跳转到406B51处,程序只会跳转到406B52处,故406B51处的代码是花指令,干扰了ida的反编译,我们在406B51处按 U(取消数据类型定义),

Screenshot 2021-11-17 154604

发现406B51处的数据为 0E8h 这是call指令的汇编代码,这条指令是常见的花指令,让ida以为要调用一个函数,造成反汇编失败,所以反编译更不能成功,我们把这个数据 NOP 掉,

Screenshot 2021-11-17 154656

然后在main函数上按 U,

Screenshot 2021-11-17 154747

再按 P(定义该段代码处为函数),

Screenshot 2021-11-17 154808

看到红色的部分就消失了,这时候我们就可以F5反编译了,

Screenshot 2021-11-17 154237

简单查看分析后,可以看出**sub_401360()**为走迷宫函数,进去看看,

1223

Screenshot 2021-11-17 154332

**dword_407000[]**里面保存的就是迷宫图了,转换成c语言数组复制出来,处理一下,

image-20211117163101112

如图 X 是原本的 0,遇到 X 一直走到底,直到不是 X,不能超出上下左右四个边界,最后在12步到达 002 处,这12步的迷宫走法就是flag

总结

比赛的时候Easy_Maze没做出来,ida无法F5就束手无策了,虽然也有用动态调试,但是没有冷静分析汇编来理解程序的执行,本来可以通过动态调试获得迷宫地图,但是实际情况是像无头苍蝇一样的调试,根本原因就一个——还是太菜了,简简单单的反调试花指令都搞不定,之前遇到这种题的时候都是略过,导致自己对反反调试方法一无所知,简单的分析也做不到,感觉最近需要恶补一下反反调试的知识了。