Переполнение стека в C # - PullRequest
       46

Переполнение стека в C #

2 голосов
/ 17 марта 2012

Я хотел бы написать уязвимую программу, чтобы лучше понять переполнение стека (причины) в c #, а также в образовательных целях.По сути, я «просто» хочу переполнение стека, которое перезаписывает EIP, поэтому я получаю контроль над ним и могу указать на мой собственный код.Моя проблема: какие объекты используют стек в качестве области памяти?Например: Программа анализирует текстовый файл с рекурсивным побайтным чтением до тех пор, пока не будет найден разрыв строки (да, я думаю, никто этого не сделает, но так как это только для обучения ...).В настоящее время я добавляю строку с шестнадцатеричным значением символов в текстовом файле.Эта строка является полем объекта, который создается после вызова main ().Используя WinDbg, я получил эти значения после переполнения стека из (почти) бесконечной рекурсии:

(14a0.17e0): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=0023f618 edx=778570b4 esi=fffffffe edi=00000000
eip=778b04f6 esp=0023f634 ebp=0023f660 iopl=0

Кстати, я использую машину AMD Win7x86, если это из интереса.Я видел много примеров C ++, вызывающих переполнение стека с помощью strcpy, есть ли подобный метод в c #?

Best Regards, NoMad

edit: я использую этот код, чтобы вызвать переполнение стека.

class FileTest
{
    FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read);
    string line = String.Empty;
    public FileTest()
    {
        Console.WriteLine(ReadTillBreak());
    }

    private string ReadTillBreak()
    {
        int b = 0;
        b = fs.ReadByte();
        line += (char)b;
        if (b != 13)
            ReadTillBreak();
        return line;
    }
}

Можно ли переполнить стек и записать в eip строковую строку (то есть содержимое test.txt)?

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

Причина, по которой вы можете использовать повреждения стека в C и C ++, заключается в том, что вы сами обрабатываете память, а язык позволяет вам делать всякие сумасшедшие вещи.C # работает в среде, специально разработанной для предотвращения многих из этих проблем.Т.е., хотя вы можете легко генерировать переполнение стека в C #, вы никак не можете изменить поток управления программой таким образом, используя управляемый код.

Способ, которым эксплойты против управляемых сред обычно работают, - это, так сказать, вырваться из песочницы.Пока код запускается в песочнице, существует множество этих хитростей, которые просто не будут работать.

Если вы хотите узнать о повреждении стека, я предлагаю вам придерживаться C или C ++.

0 голосов
/ 17 марта 2012

Мне не совсем понятны описания того, что вы пробовали.Переполнения стека, как правило, не «перезаписывают EIP».

Чтобы вызвать переполнение стека, самый прямой путь выглядит примерно так:адрес возврата в стеке, бесконечный вызов которого без возврата, в конечном итоге, израсходует все пространство стека.Конечно, современные приложения Windows имеют тонны стекового пространства, поэтому это может занять некоторое время.Вы можете увеличить объем использования стека для каждого вызова, добавив в метод аргументы или локальные переменные.

...