示例程序
使用IDA打开该程序:
notion image
上图为IDA反汇编出来的主函数内容,可以看到SMC的实现一般会伴随着VirtualProtect函数的使用,这是因为解密后的代码需要执行就需要赋予对应内存地址以执行权限,等解密完后又需要将对应内存地址的写权限去掉。
回到程序本身,思路比较清晰,14行的for循环对403020处的数据进行异或解密,大小为368字节,然后讲这段数据作为代码执行,传给该函数的参数为V4,也就是用户输入的flag。所以基本可以判断出该程序利用SMC加密的函数就是flag的验证函数。
在第18行处下了断点,然后按G跳转到内存地址403020处。
notion image
然后选中403020到403BA0处的代码按U清楚之前的函数定义,然后回到403020处将按c将数据转换为代码,接着按p以函数的形式呈现,最后F5就可以看到flag验证函数的伪代码了。
notion image
分析该段验证函数,v3数组为密文,第一个for循环为V2数组置零,最后一个for循环是将用户输入的flag的每个字节异或0x61,得出密文,逆向该算法脚本为:
notion image
ACTF{SMC_Protect_Need_Your_Debug_Skill}