参考链接:https://blog.csdn.net/weixin_45055269/article/details/114576865,写的比较简略
1.拖进来检查PE,发现UPX壳
2.尝试脱壳发现无法运行

3.带壳分析,输入flag后在VirtualAllocated下断

执行返回到主程序的位置,大概是要对flag进行处理

4.单步下走,利用flag[:8:5]进行异或恢复代码,进call该函数

需要预判flag的5个字节,由于异或完是个函数,假设开头5个字节为
55 push ebp
8BEC mov ebp,esp
83EC XXsub esp,XX
因此重新异或获得flag的5个字节,tmp数组为为恢复前的函数前5个字节

5.该函数内部花指令混淆,但代码较少,通过在进入该函数前flag参数地址下硬件访问断点,确定只有一个异或
,使用日志输出异或flag的字节数组


同时在该函数里也可以确定flag的长度

6.执行完该函数继续在flag地址下断

又到了一个异或的地方,打印日志


结合异或的执行频次为1(0) -> 2(0 1) -> 4(0 1 2 3) -> 8(0 1 2 3 4 5 6 7) -> 16(...)

大概确定一组换位异或的形式

一共有65组循环

7.出了换位异或函数,继续单步向下,注意出现引用flag地址的地方

直接进行比较,然后输出right、wrong,然后退出

8.根据以上信息,ans数组先倒序的换位异或,再异或一开始的key
