2015-03-11 7 views
0

Мне была дана программа для задания и сказали сделать переполнение буфера на нем. Мой профессор настроил виртуальную машину, над которой мы работаем, для выполнения 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\00x00x90. Независимо от того, программа всегда думает, что s1 - это весь длинный ввод и сбой. Даже если он не распознает терминатор, почему он даже смотрит за пределы 64 символов, выделенных s1?

EDIT: Теперь я пытался ставить пробел между именем файла и остальной частью полезной нагрузки и который сохраняет файл с выхода, но только потому, что зсап останавливается в пространстве и ISNT»чтение в остальной части полезной нагрузки

ответ

0

Попробуйте создать такой файл, как /tmp/{shellcode here}. Даже если ваша FS не поддерживает файлы с именами, содержащими некоторые байты из выбранного вами шеллкода, их много.

Вы также можете попробовать поместить шеллкод в переменную среды.