原理与思考请参见 第一章,本文为详细的样本分析,且较为偏向初学者,会一步步详细的说明,如有错误请轻喷。样本HASH:cbef6bd78137deab082d39983cdb198f370330da410c5d29f65af2386b8c1b2d由于涉及APT等原因不能直接提供样本,请自行寻找下载。
拿到样本后个人比较喜欢先上DIE查壳并确定语言类型,DIE下载链接:看到这个结果还是比较奇怪的,虽然使用GCC的不少,但常见的还是VS这种编译器,我们上IDA看看他的虚实。上了IDA,根据你的IDA版本可能会停在不同的地方,我测试的IDA7.7会自动识别到main函数(虽然被混淆了),但我们这里假设你停留在了Main Entry中,即下图这个函数里:按照一般我们的经验来说,main函数一般在401170,我们点进这个函数,通过对参数的判别大致推测main函数在这里:看到这就发现这个程序大概率是被混淆过的,我们点进去看看,然后就发现在代码最下部分有这样的特征:根据经验这个样本是GO语言的样本,如果你不能确定这个是GO语言的话可以shift+f12看看字符串部分带有cgo的库:
知道了样本是带着混淆的go后我们就需要先做去混淆的操作,由于对go研究不多,使用IDAGolangHelper无果后只能想想其他的法子。正好看到了rizzo插件,想着用一下试试。于是写了个go语言的基本库调用,由于go要对所有导入的库实例化并调用,所以写完的代码基本长这样:然后编译之后制作rizzo特征文件,导入特征文件到要分析的文件后就得到了去混淆后的程序,main函数代码如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课