C # создание переполнения буфера - PullRequest
7 голосов
/ 05 февраля 2011

Я пытаюсь создать переполнение буфера с C # для школьного проекта:

unsafe
{
    fixed (char* ptr_str = new char[6] {'H', 'a', 'l', 'l', 'o', ','})
    {
        fixed (char* ptr_str2 = new char[6] {'W', 'e', 'r', 'e', 'l', 'd'})
        {
            fixed (char* ptr_str3 = new char[6] {'!', '!', '!', '!', '!', '!'})
            {
                for (int i = 0; i < 8; i++)
                {
                    ptr_str2[i] = 'a';
                }

                for (int i = 0; i < 6; i++)
                {
                    this.Label2.Text += ptr_str[i];
                    this.Label3.Text += ptr_str2[i];
                    this.Label4.Text += ptr_str3[i];
                }
            }
        }
    }
}

Я думал, что это затопит ptr_str2 и тем самым перезапишет символы в ptr_str. Однако этого не происходит. Он выполняется, но значения в ptr_str не перезаписываются.

Кто-нибудь может помочь в достижении этого? Я не понимаю, что я делаю не так.

Ответы [ 4 ]

6 голосов
/ 05 февраля 2011

Традиционная атака, использующая переполнение буфера, переполняет буфер stack ; вы переполняете буфер heap . Намного легче увидеть запись в один буфер, разбивающий другой буфер, когда они оба находятся в стеке. Попробуйте использовать stackalloc вместо нового символа для принудительного размещения в стеке.

6 голосов
/ 05 февраля 2011

Переполнение стека - это переполнение стека вызовов. Это сделано намного проще:

int Test ()
{
    return Test ();
}

Console.WriteLine (Test ());

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

5 голосов
/ 05 февраля 2011

Вам не хватает того факта, что массивы сами являются объектами.У них есть заголовок объекта, как у любого управляемого типа ссылки, и личное поле, в котором хранится размер массива.Вы должны сначала перезаписать их, прежде чем начинать перезаписывать элементы массива.На 32-битной машине вы начнете перезаписывать первый элемент ptr_str2 следующим образом:

                        for (int i = 0; i < 13; i++) {
                            ptr_str[i] = 'a';
                        }

Конечно, это должно быть 13 *.на цикл.Отладка + Windows + Память + Память 1, введите «ptr_str» в поле «Адрес».Шаг код, чтобы увидеть, как меняется память.Сразу после этого вы увидите ptr_str2, 4 байта для syncblk, 4 байта для указателя таблицы методов и 4 байта для длины массива.Всего 12 байт, 6 символов.

0 голосов
/ 05 февраля 2011

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

Переполнение стека можно сделать просто:

public void Stackoverflow()
{
    Stackoverflow();
}

, а затем позвонив куда-нибудь Stackoverflow()

...