Возникновение последовательности 0x90 (NOP) в допустимом коде - PullRequest
2 голосов
/ 17 октября 2011

фон: Я написал скрипт на python для проверки IP-пакетов, в частности, полезной нагрузки / данных пакета, чтобы определить, может ли он использоваться при переполнении буфера (стека). Теперь, насколько я понимаю, салазки NOP используются для заполнения стека, так что указатель инструкций в конечном итоге попадет в ваш код эксплойта, что я легко могу обнаружить, просматривая повторяющиеся вхождения 0x90. Я видел код с большим количеством команд NOP, равным всего 8 в случае SQL Slammer, поэтому я мог бы использовать, как минимум, 8.

Теперь мой вопрос, часто ли сани NOP используются в легитимном коде? Если ответ «да», есть ли несколько конкретных случаев (что означает, что я могу найти эти случаи и затем исключить пакет как потенциально безвредный), или этот подход просто не практичен для выявления вредоносного кода?

Ответы [ 3 ]

8 голосов
/ 17 октября 2011

Компилятор будет генерировать NOP для выравнивания кода - например, на некоторых итерациях x86 переходы выполняются быстрее, если переход destination выровнен по 4-, 8- или даже 16-граница байта.

Некоторые компиляторы пытаются использовать «длинные NOP», когда это возможно - отдельные инструкции, занимающие более одного байта пространства, которые могут формально что-то делать, но не влияют на состояние процессора - какна некоторых итерациях архитектуры x86 это быстрее.Например, 66 90 - это двухбайтовая NOP, а 8d 74 26 00 - это четырехбайтовая NOP (технически lea 0(%esi,%eiz,1),%esi, но, как вы можете видеть, это просто копирует значение из %esi в себя, поэтому эффекта нет).Однако их нельзя использовать во всех случаях, и последовательности, которые являются самыми быстрыми на некоторых x86, очень удручающе часто медленны на других.Я не читал текущие рекомендации по микрооптимизации, но не удивлюсь, если бы Intel и AMD работали над тем, чтобы сделать строку из 90 s самым быстрым способом сделать длинный NOP, и их компиляторы совпали.

3 голосов
/ 17 октября 2011

из википедии :

NOP чаще всего используется для целей синхронизации, чтобы заставить память выравнивание, чтобы предотвратить опасности, занять место задержки ответвления или как заполнитель будет заменен активными инструкциями позже в программе разработка (или заменить удаленные инструкции, когда рефакторинг будет быть проблематичным или трудоемким). В некоторых случаях NOP может иметь незначительные побочные эффекты; например, на процессорах серии Motorola 68000, код операции NOP вызовет синхронизацию конвейера.

Кроме того, 0x90 может использоваться компиляторами в качестве наполнителя для неинициализированных массивов, в случае, если данные в массиве интерпретируются как коды операций, они ничего не делают. Вы видите аналогичный эффект с Visual Studio, которая заполняет неинициализированные массивы 0xCC, что равняется int 3, что вызывает остановку точки останова.

Кроме того, любые данные в исполняемом файле могут содержать любое число 0x90, и различие между ними и кодом может быть нетривиальным.

2 голосов
/ 17 октября 2011

Я только что просмотрел последний двоичный файл, который я скомпилировал (не вредоносный код x86 в Linux), и обнаружил:

016b5e0 458b c9ec 90c3 9090 9090 9090 9090 9090

Я думаю, вы можете сделать вывод, что нахождение повторяющихся последовательностей 0x90 не обязательно указывает назлой умысел.

...