2015-05-19 1 views
0

Я следую учебник 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 и перерыв?

ответ

1

Может кто-нибудь объяснить, откуда берутся нулевые байты?

0x000ff710 несет ответственность за них (ну, это). Действительно, 0x000ff710 отображается в память, как и с функцией пакета, которая гарантирует, что вы пишете адрес, который является unsigned long 32bits = 4 байта = 0x00, 0x0f, 0xf7, 0x10

Как вы можете видеть, первый байт (0x00) равен NULL.

Кроме того, где шелковый код в моем коде, NOP и перерыв, перейдите к?

Ваш код - это в основном скрипт perl, который будет генерировать файл .m3u с именем crash.m3u. Вы создаете его, добавив 26063 junky 'A' (0x41) в начало файла (сразу после open), к которому вы присоединяетесь к оператору . (обычно к которому используется конкатенация на многих языках), адрес, здесь 0x000ff710. Затем, наконец, вы присоедините к этому свой шеллкод (пучок NOP с int 3 или int 0xcc, который устанавливает контрольную точку для вашего отладчика).

Ваш код "напечатал" в файл crash.m3u. Если вы не знакомы с понятием записи файла я предлагаю вам открыть оболочку и те команды типа:

echo "that's some text"

echo "that's some text in a file" > myfile

Бывший выведет сообщение стандартный вывод, а последний выведет его в файл.

print $FILE $junk.$eip.$shellcode; «печатает» ваш шеллкод в файл $ FILE.

+0

Ваш ответ полезен, но не совсем то, что я ищу. Позвольте мне перефразировать вопрос. – Abundance

+0

Ваш код генерирует файл, который будет считываться уязвимым приложением. Именно это приложение отвечает за отображение вашего файла в памяти. При этом ваш шеллкод будет отображаться в ОЗУ. – cfz42

0

0x000ff710 содержит null байт.

Программа получит данные, пока не найдет 0x00.

0x90 и 0xcc которые следуют 0x00 никогда не будут прочитаны программой.

Таким образом, вы никогда не найдете шелл-код, такой как 90 90 90 90 90 90 90 90 ... в своем коде.

Смежные вопросы