Мне была дана программа для задания и сказали сделать переполнение буфера на нем. Мой профессор настроил виртуальную машину, над которой мы работаем, для выполнения shellcode в стеке, поэтому мне нужно только поместить начало шеллкода в обратный адрес. Буфер, который я пытаюсь переполнить, - s1[64]
. s1
должно быть допустимым именем файла, которое будет использоваться позже в программе, и приведет к ошибке exit(1)
, если он недействителен. Я предполагаю, что я должен заполнить s1
с вводом в таком формате: validFileName+fileNameTerminator+Filler+Shellcode
.Как я могу разграничить допустимый ввод и шелл-код для моего переполнения буфера?
S1
считывается из командной строки с использованием scanf(%s,s1)
. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я выбираю для размещения между моим действительным именем файла и началом моего наполнителя и shellcode, программа считает, что весь ввод является именем файла и не открывается. Я попытался с короткими именами файлов и именами файлов длиной 63 и 64, все они дают одинаковый результат. Например: Если я даю ввод для s1
как /./././././././././././././././././././././././testFile1GCL.txt\0AAAAAAAA\xeb\x18\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x8d\x1e\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
Я ожидаю, что значение в s1
будет /./././././././././././././././././././././././testFile1GCL.txt
, поскольку оно достаточно длинное, чтобы заполнить весь буфер, а за ним следует нулевой терминатор. Проблема в том, что когда я распечатаю s1
, он печатает весь ввод так, как будто он не видит нулевой ограничитель и явно смотрит за пределы заданного диапазона. Это приводит к сбою программы, потому что эта гигантская вещь явно не является допустимым именем файла.
Я попробовал почти все, что я могу думать, чтобы поместить между именем файла и остальной части моей полезной нагрузки, в том числе \\0
\0
0x0
0x90
. Независимо от того, программа всегда думает, что s1
- это весь длинный ввод и сбой. Даже если он не распознает терминатор, почему он даже смотрит за пределы 64 символов, выделенных s1
?
EDIT: Теперь я пытался ставить пробел между именем файла и остальной частью полезной нагрузки и который сохраняет файл с выхода, но только потому, что зсап останавливается в пространстве и ISNT»чтение в остальной части полезной нагрузки