Раньше защищенная память была тем, что вы могли просто получить доступ к любому биту памяти, используя его физический адрес , и манипулировать им. Так работали Windows (до Windows 95, например, 3.1) на основе DOS и DOS.
Защищенная память, или виртуализированная память, означает, что вы можете делать такие вещи, как выгружать части памяти на диск, по сути, он притворяется, что у него больше памяти, чем физически имеет компьютер. Фрагменты памяти можно менять местами по мере необходимости, загружать и выгружать, при этом запущенная программа ничего не делает. Все эти адреса являются виртуальными или «фальшивыми», поскольку они не существуют физически, но, что касается ЦП, они реальны и работают точно так, как вы ожидаете, что-то достигается за счет встроенного модуля управления памятью . (MMU) в ЦП.
После защиты памяти ваша программа «пользовательского пространства» больше не видит адреса физической памяти, а вместо этого видит виртуальные адреса, которыми управляет сама операционная система. В системах типа Intel ядро, ядро операционной системы, работает в специальном кольце защиты , которое предотвращает прямой доступ пользовательских программ к памяти или управление ею.
Любая многопользовательская система должен реализовать этот вид защиты памяти и ядра, иначе не будет возможности предотвратить доступ одного пользователя к памяти процессов другого пользователя.
В ядре нет "mallo c" "или" свободный "в общепринятом смысле, ядро имеет свои собственные специальные механизмы распределения. Они полностью отделены от традиционных функций malloc()
и free()
в стандартной библиотеке C и никоим образом не совместимы. Каждое ядро, будь то Linux или BSD, Windows или другое, делает это по-разному, даже если все они могут поддерживать код пользовательского пространства, который использует одну и ту же функцию malloc()
.
Там не должно быть никакого способа, которым вы могли бы с помощью простых вызовов выделения памяти взломать sh систему. Если можете, поздравляю, , вы обнаружили эксплойт и должны задокументировать его и направить соответствующим сторонам для дальнейшего анализа. Имейте в виду, что такие вещи хорошо изучены, поэтому вероятность того, что вы обнаружите один случайно, очень мала. Соревнования вроде pwn2own показывают, сколько работы требуется для обхода всей этой защиты.
Также важно помнить, что операционная система не обязательно находится в фиксированном месте. Рандомизация макета адресного пространства - это метод шифрования адресов различных функций и данных, чтобы гарантировать, что эксплойт не может использовать жестко запрограммированные значения. Раньше это было обычным явлением, вы могли предсказать, где различные вещи будут жить в памяти, и делать слепые манипуляции с помощью крошечной ошибки, но теперь это стало намного сложнее, так как вам нужно не только найти эксплойт для манипулирования, но и другой, чтобы обнаружить адрес в первую очередь .
При всем вышесказанном, в C или C ++ нет ничего особенного с точки зрения «мощности», которая позволяла бы ему делать то, что не может сделать никакой другой язык. Любая программа, способная связываться с функциями операционной системы, имеет такую же эквивалентную «мощь» с точки зрения контроля. Это включает Python, Perl, Ruby, Node.js, C# и длинный, длинный список других, которые могут связываться с C библиотеками и делать произвольные вызовы функций.
Люди прототипы «эксплойтов» на том языке, который наиболее удобен, и часто это Perl или Python, а также C. Это действительно зависит от того, чего вы пытаетесь достичь sh. Некоторые обнаруженные ошибки настолько легко воспроизвести, что вы можете сделать это с помощью чего-то столь же приземленного, как браузер JavaScript, как это было в случае с Row Hammer .