Эксплойты обычно атакуют код C, и поэтому код оболочки часто необходимо доставлять в NUL-оканчивающейся строке .Если код оболочки содержит NUL-байты, то используемый код C может игнорировать и удалить остаток кода, начиная с первого нулевого байта .
Это касается только машинный код .Если вам нужно вызвать системный вызов с номером 0xb, то, естественно, вам нужно иметь возможность генерировать число 0xb в регистре EAX, но вы можете использовать только те формы машинного кода, которые не содержат нулевых байтов в самом машинном коде..
xor eax, eax
будет инвертировать все 1 бит в eax
, то есть ноль it.Он является функциональным эквивалентом
mov eax, 0
, за исключением того, что последние будут иметь нулевой код в нулевом байте в машинном коде *1028*.
Машинный код для
xor eax, eax
mov byte al, 0x0b
равен
31 c0 b0 0b
Как видите, в нем нет встроенных нулевых байтов.Машинный код для
mov eax, 0xb
:
b8 0b 00 00 00
Обе эти программы функционально эквивалентны в том смысле, что они устанавливают значение регистра EAX равным 0xb.
Если последнийкод оболочки обрабатывается C-программой как строка с нулевым символом в конце, а остальная часть после b8 0b 00
может быть отброшена программой и заменена другими байтами в памяти, что по существу делает шеллкод неработающим.