Null Pointer第一次RE公开赛
关键词: windows逆向, 混淆, 32/64位切换
外层
不断的在代码中插入数据,多次call加上esp + 8实现跳转。并且在函数中嵌入小函数阻挡IDA创建函数。
只好一点一点patch完成还原:

过程中发现两个函数:

获取Windbg的环境变量实现反调试。

把自身的一段代码载入并执行。
内层

这部分就是载入的代码了,坑点在于32位代码和64位代码都有,通过设置cs寄存器完成状态切换。怀疑出题人也做到原题了,然后实现了一个又一个跳转,从32开始验证,32 -> 64 -> 32 -> 64 ...
最后到达结束分支返回1通过验证。