在合法代码中出现0x90(NOP)序列

Tro*_*lts 2 stack-overflow security x86 packets

背景:我编写了一个python脚本来检查IP数据包,特别是数据包的有效负载/数据,以便检测它是否可以用于缓冲区(堆栈)溢出.现在据我所知,NOP雪橇用于填充堆栈,以便指令指针最终会进入您的漏洞利用代码,我可以通过查找重复出现的0x90轻松检测到.我已经看到有很多NOP命令的代码,在SQL slammer的情况下只有8个,所以我或许可以使用8作为最小值.

现在我的问题是,NOP雪橇经常用于合法代码吗?如果答案是肯定的,是否有一些特定情况(这意味着我可以查找这些情况,然后排除数据包可能无害)或者这种方法对于识别恶意代码是不实际的?

zwo*_*wol 8

编译器将生成NOP以对齐代码 - 例如,在x86的某些迭代中,如果跳转目标与4,8或甚至16字节边界对齐,则跳转执行得更快.

有些编译器尝试在可能的情况下使用"长NOP" - 单个指令占用多个字节的空间,并且可能正式执行某些操作,但对处理器状态没有影响 - 就像在x86架构的某些迭代中一样,这是快点.举例来说,66 90是一个两字节NOP,并且8d 74 26 00是四字节的NOP(技术上lea 0(%esi,%eiz,1),%esi,但你可以看到,只是复制的价值%esi本身,所以没有影响).但是,这些都不能在所有情况下使用,并且在某些x86es上速度最快的序列通常在其他情况下非常.我还没有阅读当前的微优化指南,但如果英特尔和AMD正在努力制作一系列的话,我也不会感到惊讶90做长NOP的最快方法,让他们的编译器匹配.