参考链接: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