2012-03-17 4 views
2

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

(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 

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

С наилучшими пожеланиями, Nomad

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

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)?

+0

Если вы хотите понять уязвимости управляемых систем, ознакомьтесь с замечательной книгой Erez Metula о руткитах с управляемым кодом: http://www.amazon.com/Managed-Code-Rootkits-Hooking-Environments/dp/1597495743/ ref = sr_1_1? ie = UTF8 & qid = 1332014581 & sr = 8-1 – zmbq

ответ

4

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

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

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

+0

+1 для упоминания управляемого кода. –

+0

О, да, теперь это имеет смысл, я уже думал о .net VM, предотвращающем такие вещи, но я надеялся, что это будет возможно на моем любимом языке программирования. Спасибо за совет – NoMad

0

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

Чтобы вызвать переполнение стека, наиболее прямым способом является нечто подобное.

void RecursiveMethod() 
{ 
    RecursiveMethod(); 
} 

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

+0

Я разместил свой код выше. Итак, пространство стека используется аргументами и локальными переменными, а не полями? – NoMad

+0

@NoMad - Предположим, что есть стек в первую очередь. –

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

  • Нет связанных вопросов^_^