Я следую учебник Corelan на переполнение буфера (https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/) и написал следующий код:Почему ESP заполняется нулевыми байтами после следующего EIP-адреса?
my $file= "crash.m3u";
my $junk= "\x41" x 26063;
my $eip = pack('V', 0x000ff710);
my $shellcode = "\x90" x 25;
$shellcode = $shellcode."\xcc";
$shellcode = $shellcode."\x90" x 25;
open($FILE, ">$file");
print $FILE $junk.$eip.$shellcode;
close($FILE);
Код в основном переполнение буфера, так что EIP переписывается с адресом 0x000ff710. Я ожидаю, что стек включит написанный shell-код \ x90, а также \ xcc.
Я открываю код в Immunity Debugger и вижу, что EIP и ESP оба указывают на 0x000ff710. Поскольку следующая часть моего скрипта - это шелл-код, я, естественно, ожидаю увидеть там код оболочки. Вместо этого я вижу кучу нулевых байтов, а именно последовательность 00 00 00 01 00 00 ... и т. Д., А затем в конечном итоге следует целая группа A. Corelan объясняет это как «000ff730 [0x000f710 в моем случае] содержит нулевой байт, который является ограничителем строк ... так что вы видите A из первой части буфера ... Мы никогда не дошли до того, что начали писать наши данные после перезаписывания EIP ... ".
Может ли кто-нибудь объяснить, откуда берутся нулевые байты? Кроме того, где шел шелл-код в моем коде, NOP и перерыв?
Ваш ответ полезен, но не совсем то, что я ищу. Позвольте мне перефразировать вопрос. – Abundance
Ваш код генерирует файл, который будет считываться уязвимым приложением. Именно это приложение отвечает за отображение вашего файла в памяти. При этом ваш шеллкод будет отображаться в ОЗУ. – cfz42