Привет ! , мне 16 лет, я египетский компьютерный хакер, и я хотел поделиться с вами знаниями о взломе двоичных файлов.
адрес фейсбука: https://www.facebook.com/mahmoudadel0x
Давайте начнем, я расскажу о трех темах:
три пока и на следующей сессии я продолжу
1- память компьютера и виртуальная адресация
2- Функциональность ОС и обзор управления
3- переполнение буфера
память компьютера и виртуальная адресация:
каждая программа выполняется уже запущенной программой и наследует от нее переменные среды, так работают алгоритмы, уже запущенная программа - это интерфейс для вас, это может быть оболочка входа в систему с графическим интерфейсом или TTY и т. д.
как только программа запускается системным вызовом ядра, ответственным за это, мы поговорим об этом позже, программа перемещается в физическую память, и ее инструкции выполняются строка за строкой.
программа может вызывать любую функцию в своем сегменте по ее адресу, например 0x774ffffffffff, так как же ядро могло управлять этим доступом, когда любая программа может получить доступ к любому другому сегменту программ и украсть данные! поскольку здесь есть виртуальная адресация, это задание ядра для создания управляемых страниц, содержащих виртуальное адресное пространство и соответствующее адресное пространство физического ОЗУ, если программа пытается получить доступ со своей страницы, она попадает в обработчик прерываний.
Режимы ЦП и функциональность ОС, обзор управления:
теперь давайте поговорим о том, как на самом деле программа работает программно, пример записи в файл
когда вы пишете в файл на C или PHP или другом языке, на самом деле, когда код компилируется/интерпретируется, он просто вызывает определенную функциональность в ОС для выполнения операции, это называется системным вызовом, вы можете прочитать о системных вызовах подробнее в google/wiki или справочные страницы Linux, этот вызов просто обрабатывается ядром — это возможно по-разному, например, я объясню программу сборки:
`
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
`
следующие инструкции добавляют номер 4 в регистр eax cpu, который является номером системного вызова, имеет соответствующую функцию в ядре, это вызов sys_write, переместите 1 в регистр ebx, который является номером дескриптора файла, который является ее STDOUT (конечное виртуальное устройство в этом ситуация, чтобы показать вам сообщение на экране)
и длина для ecx и фактическое сообщение для edx, и теперь самая важная часть int 80h, которая равна int 0x80, это программное прерывание, поиск в Google для получения дополнительной информации, это прерывание уже имеет определенный раздел, таблица дескрипторов прерываний ядра и так далее. как только процессор выполнит это, он направит выполнение в ядро, а ядро делает все остальное и принимает аргументы из регистров процессора!
теперь, чтобы закончить контрольную часть, возможно, вы спросили, может ли само приложение получить доступ к этому файлу на диске! , нет из-за режимов процессора! ядро работает на другом аппаратном уровне выполнения, который позволяет взаимодействовать с оборудованием и BIOS, ядро имеет доступ к оборудованию, но приложение не может, поэтому приложение в защищенном режиме процессора на самом деле не может делать ничего, кроме того, что предлагает ядро с помощью системных вызовов! управление этими режимами с помощью регистра процессора, называемого cr0, ищите его в google / wiki, этот cr0 является регистром управления процессором, как я сказал, он дает вам контроль, поэтому вы не можете использовать его из пользовательского приложения (пользовательское пространство), вы можете написать код пространства ядра и вставить модуль в ядро)
buffer_Overflows:
теперь у вас есть основы, давайте перейдем к целевой теме, переполнение буфера, что на самом деле происходит, это использование опасных системных вызовов без проверки привязки или каких-либо ограничений! Например, такие вызовы, как gets() , не во всех ситуациях вы можете использовать переполнение буфера, нет, вы не всегда можете, и вы просто можете использовать только отказ в обслуживании! на следующем сеансе я объясню способ эксплуатации, теперь давайте сначала разберемся
когда программа вызывает функцию, она использует инструкцию call и ret cpu, когда вызов происходит, cpu переключает следующую инструкцию, которая будет выполняться, на первую инструкцию в вызываемой функции после завершения функции, ret получает выполнение, что означает возврат вызывающей стороне, как процессор знает вызывающую сторону адрес ! сохранив его в СТЕКЕ! ex (сохранить eip=0xcaller), когда происходит переполнение буфера, данные в сегменте стека перезаписываются, так что адрес меняется на новый адрес простой программы на C:
char buffer[4];
int var = 0;
scanf("%s", &buffer);
printf("переполнение var = 0x%x\n", var);
эта программа объявляет массив из 4 символов типа и переменную с именем var целочисленного типа, равную нулю, и вызывает ядро с помощью системного вызова scanf, чтобы принять пользовательский ввод без проверки границ, позволяет увидеть результат в отладчике.
теперь этого достаточно, чтобы иметь возможность понять, что все надеюсь, что вы теперь понимаете, что происходит хорошо. В следующем сеансе я расскажу вам более подробно о защите и обходах двоичного взлома, и не забудьте поддержать меня, подписавшись на меня в facebook и twitter, я нахожусь в https://twitter.com/гнуаби
, Благодарность