2012-05-10 2 views
2

Мне предоставлен файл кода 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; 
} 
+0

Для начала я бы рекомендовал попробовать переполнить вход в 'valgrind' и посмотреть на значения стека и т. Д. Но вы написали сборку и сами получили байт-код? Это может иметь смысл сделать это. Кроме того, убедитесь, что у вас есть исполняемый стек. Точка изменения входных данных, скорее всего, определит, что происходит со стеком. – RageD

+0

Вы понимаете *, когда произойдет ошибка сегментации? Знаете ли вы, как вызывать это, не меняя входные данные, или предоставляете разные входные данные? Эксперимент. –

+2

У вас, вероятно, есть заметки, чтобы выполнить задание. В какой-то момент они, вероятно, обсуждают структуру стека, перечитывают их. Когда вызывается функция 'vuln', в стеке есть некоторое пространство для (среди прочего) массива' a' и обратного адреса. Что происходит, когда вы пытаетесь записать больше данных в 'a', чем подойдет? Введите некоторые легко узнаваемые данные в качестве вашего ввода. Получите segfault и сохраните дамп ядра. Откройте дамп ядра в GDB. Теперь посмотрите на регистры. Посмотрите, можете ли вы получить определенное значение для отображения в EIP, изменяя длину ввода. –

ответ

1

То, что я не понимаю, почему я должен проверить с различными значениями? Я не уверен, что код поможет, но я просто не понимаю, как изменить вход.

Переполнение буфера произойдет только с учетом конкретного ввода, поэтому вы должны попробовать разные входы, чтобы увидеть, что может вызвать проблему.

Подсказка: переполнение буфера происходит, когда пользовательский ввод длиннее ожидаемой программы, поэтому вы должны попробовать с различной длиной ввода до тех пор, пока программа не начнет сбой или не сделает неожиданные вещи.

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