Ромон для похудения инструкция для применения

2

Все примеры уязвимостей, связанных с переполнением буфера обмена, создавались и тестировались на серверах IBM BladeCenter® JS22 Express, IBM BladeCenter QS21 и Sony Playstation 3 под управлением ОС Red Hat Enterprise Linux 4 Update 7.

Переполнения буфера - обзор

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

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

За дополнительной информацией о том, что такое переполнение буфера и как его избежать, обратитесь к статье "Безопасное программирование: учет переполнений буфера".

В начало

Архитектура POWER

Архитектура POWER (Performance Optimization With Enhanced RISC) была изначально разработана корпорацией IBM в начале 1990-х годов и впервые использована в семействе RISC System/6000. В 1991 году Apple, IBM и Motorola создали альянс AIM и начали совместную работу по развитию архитектуры PowerPC®, расширяя ее возможности. В 1997 году Motorola и IBM начали другой проект по оптимизации PowerPC для встроенных систем. В конце 2004 году был образован консорциум Power.org с целью развития спецификаций сообществом и поддержки совместимых средств разработки для облегчения интеграции и совершенствования реализации архитектуры POWER.

Архитектура POWER является открытой и определяется набором инструкций архитектуры POWER (Power Instruction Set Architecture, Power ISA), поддерживаемой Советом по надзору за Архитектурой POWER (Power Architecture Advisory Council), который следит за совместимостью реализаций и выдает разрешения на разработку и производство процессоров с POWER-совместимой архитектурой. Прекрасными примерами таких процессоров служат процессоры консоли Xbox 360 и Cell Broadband Engine.

Процессор с реализацией, соответствующей архитектуре POWER, имеет четыре основных типа инструкций:

  • Инструкции ветвления.
  • Инструкции для операций с фиксированной точкой и другие инструкции, использующие регистры операций с фиксированной точкой.
  • Инструкции для операций с плавающей точкой и инструкции с десятичной плавающей точкой.
  • Векторные инструкции.

Инструкции для операций с фиксированной точкой обрабатывают операнды, состоящие из байтов, полуслов, слов и двойных слов. Инструкции для операций с плавающей точкой обрабатывают операнды с одинарной и двойной точностью. Векторные инструкции обрабатывают векторы скалярных величин и скалярные величины, выраженные в байтах, полусловах, словах и четверных словах. Процессор использует инструкции длиной четыре байта с выравниванием по словам. Он обеспечивает выборку операндов в байтах, полусловах, словах и двойных словах, передачу данных между памятью и набором из 32 регистров общего назначения (General Purpose Register, GPR). Он также обеспечивает выборку операндов в полусловах, словах и двойных словах, передачу данных между памятью и набором из 32 регистров операций с плавающей точкой (Floating-Point Register, FPR). Дополнительно он обеспечивает выборку операндов в байтах, полусловах, словах и четверных словах, передачу данных между памятью и набором из 32 векторных регистров (Vector Register, VR).

  • Регистр условия (Condition Register, CR) – 32-разрядный регистр, передающий результат текущей операции и обеспечивающий проверку (и ветвление).
  • Регистр связи (Link Register, LR) – 64-разрядный регистр. Предоставляет адрес перехода для инструкции Branch Conditional to Link Register и хранит возвращенные адреса после выполнения инструкции Branch.
  • Регистр счетчика (Count Register, CTR) – 64-разрядный регистр. Содержит счетчик цикла, который может уменьшаться на 1 при выполнении команды Branch.
  • Регистр состояния оборудования (Machine State Register, MSR) – 64-разрядный регистр. Этот регистр сохраняет статус процессора. Значение 64-го бита (0 или 1) определяет режим работы процессора (32- или 64-разрядный).

Процессоры поддерживают два режима работы: 32- или 64-разрядный. В обоих режимах инструкции, хранящиеся в 64-разрядных регистрах, используют все 64 бита. Режим работы определяет, насколько эффективно интерпретируются адреса, какой статус битов присваивается, как инструкции Branch используют регистр связи (LR), а также как инструкции Branch Conditional используют регистр счетчика (CTR). Почти все инструкции доступны в обоих режимах. Эффективная адресация всегда использует все 64 бита соответствующих регистров (GPR, LR, CTR и т. д.) и выдает 64-разрядный результат. Однако в 32-разрядном режиме старшие 32 бита эффективной адресации для хранения адресов игнорируются.

Все инструкции имеют длину четыре байта и выровнены по словам. Таким образом, всякий раз, когда инструкции адресов присутствуют в процессоре (в качестве инструкций Branch), 2 младших бита отбрасываются. Соответственно, когда процессор рассчитывает адрес инструкции, два младших бита равны нулю.

Биты с 0 по 5 всегда содержат opcode. Многие инструкции дополнительно содержат расширенный opcode. Остальные биты инструкции содержат одно или несколько полей для различных инструкций.

Программы, работающие с памятью, используют эффективную адресацию, вычисляемую процессором при выполнении инструкций Storage Access или Branch, а также при выборке следующей инструкции в очереди. Байты в памяти нумеруются последовательно, начиная с 0. Каждое число в адресе связано с соответствующим байтом. Порядок байтов (прямой или обратный) для доступа к памяти определяется операционной системой.

В начало

Архитектура Cell Broadband (CBEA)

Процессор Cell Broadband Engine (Cell/B.E.) является первым представителем нового семейства процессоров, построенного на основе архитектуры Cell Broadband Engine Architecture (CBEA). Архитектура CBEA – это расширение 64-разрядной архитектуры POWER. Архитектура CBEA и процессор Cell/B.E. созданы в результате партнерства между Sony, Toshiba и IBM, известного как STI, официально стартовавшего в начале 2001 года.

Хотя процессор Cell/B.E. первоначально предназначался для использования в потребительских мультимедийных устройствах, таких как игровые консоли и телевизоры высокой четкости, его архитектура нацелена на фундаментальное повышение производительности процессора. Ожидается, что он найдет применение в широком круге приложений для коммерческого и научного применения.

Наиболее существенной отличительной чертой процессора Cell/B.E. является то, что хотя все элементы процессора совместно используют память, их функции разделены между двумя типами специализированных элементов: 64-разрядным ядром POWER (Power Processor Element, PPE) и специализированными микропроцессорами (Synergistic Processor Element, SPE).

Процессор Cell/B.E. оснащен одним блоком PPE и восемью SPE. Элемент PPE содержит 64-разрядное ядро POWER, построенное на 64-разрядной архитектуре POWER, которое может работать с 32- и 64-разрядными ОС и приложениями.

Второй тип элементов процессора – SPE - оптимизирован для выполнения SIMD-приложений с интенсивными вычислениями и не предназначен для работы операционной системы. Блоки SPE являются независимыми процессорными элементами, каждый из которых обрабатывает собственные приложения или потоки. Каждый SPE имеет полный доступ к последовательной общей памяти, в том числе к адресному пространству ввода-вывода.

Между PPE и SPE существует взаимозависимость. SPE нуждается в PPE для запуска операционной системы и, часто, для работы средств верхнего уровня для управления потоками приложений. PPE нуждается в SPE для увеличения производительности приложений.

Наиболее значительное отличие между SPE и PPE заключается в способах доступа к памяти. PPE обращается к системной памяти (эффективному адресному пространству) при помощи загрузки и сохранения инструкций, перемещающих данные между системной памятью и отдельными файлами регистра, содержимое которых может быть кэшировано.

Блоки SPE обращается к системной памяти при помощи команд прямого доступа к памяти (direct memory access, DMA), которые перемещают данные и инструкции между системной памятью и отдельными блоками локальной памяти, называющимися локальным хранилищем (local storage, LS). Для выборки, загрузки и сохранения инструкций блоки SPE, в первую очередь, используют собственные LS, а затем системную память, поскольку в LS отсутствует ассоциативный кэш. Трехуровневая организация памяти (файл регистров, локальное хранилище, системная память) с асинхронными передачами DMA между LS и системной памятью является радикальным отличием от традиционной архитектуры и модели программирования, поскольку явно распараллеливает вычисления посредством операций передачи данных и инструкций, выполняющих вычисления и сохранение результатов в системной памяти.

В начало

Управление переполнением буфера

Теперь мы рассмотрим:

  • Изменение выполнения процессов.
  • Перезапись локальных переменных в 32-разрядном режиме.
  • Перезапись локальных переменных в 64-разрядном режиме.

(Во второй части мы рассмотрим перезапись указателя на функцию в 32- и 64-разрядном режимах и некоторые примеры кода.)

Изменение выполнения процессов

Подобно архитектуре x86/x86_64, изменить выполнение заданного процесса в архитектуре Power/CBEA можно следующими способами:

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

Перезапись локальной переменной в 32-разрядном режиме

В этом разделе обсуждается, как изменить работу заданного процесса при помощи перезаписи локальной переменной.

В следующем примере показана уязвимость переполнения буфера кучи.

Листинг 1. example1.c (уязвимость переполнения буфера кучи)
#include <stdio.h> #include <stdlib.h> #include <string.h> struct mystruct { unsigned char buffer[16]; unsigned long cookie; }; int main(int argc, char argv) { struct mystruct s; if ((s = malloc(sizeof(struct mystruct))) == NULL) { perror("malloc"); exit(EXIT_FAILURE); } s->cookie = 0; if (argc > 1) strcpy(s->buffer, argv[1]); if (s->cookie == 0x42424242) { printf("Congratulations! You won a cookie!\n"); exit(EXIT_SUCCESS); } printf("Hello world!\n"); exit(EXIT_SUCCESS); }

Код в листинге 1 не проверяет данные, предоставленные пользователем, при их копировании в элемент buffer предварительно выделенной структуры struct mystruct при помощи функции strcpy , в результате чего происходит переполнение буфера кучи. В случае правильной работы пример записывает строку "Hello world!" в stdout.

Листинг 2. Компиляция и запуск кода из листинга 1
$ gcc -Wall -o example1 example1.c $ ./example1 Hello world! $

На схеме 1 показаны структура struct mystruct и ее элементы в сегменте кучи.

Схема 1. Структура struct mystruct
Lesser Greater addresses addresses struct mystruct buffer cookie [ ][ ] Bottom of Top of heap heap

Изменить работу процесса можно перезаписью элемента cookie структуры struct mystruct, расположенного справа после буфера в памяти со значением 0x42424242 value (в кодировке ASCII – BBBB).

Листинг 3. Перезапись элемента cookie
$ ./example1 AAAAAAAAAAAAAAAABBBB Congratulations! You won a cookie! $

На схеме 2 показаны структура struct mystruct и ее элементы в сегменте кучи после переполнения.

Схема 2. Структура struct mystruct после переполнения
Lesser Greater addresses addresses struct mystruct buffer cookie [AAAAAAAAAAAAAAAA][BBBB] Bottom of Top of heap heap

Перезапись локальной переменной в 64-разрядном режиме

Теперь давайте поговорим о том, как изменить работу заданного процесса при помощи перезаписи локальной переменной в 64-разрядном режиме. Различия между 32- и 64-разрядными режимами в языке C касаются только данных типа long и указателей. Все арифметические операции над указателями должны выполняться при помощи переменных типа long вне зависимости от режима. Указателю можно присвоить только значение другого указателя или переменной типа long.

Ниже приведен пример уязвимости переполнения буфера кучи:

Листинг 4. example2.c (уязвимость переполнения буфера кучи)
#include <stdio.h> #include <stdlib.h> #include <string.h> struct mystruct { unsigned char buffer[16]; unsigned long cookie; }; int main(int argc, char argv) { struct mystruct s; if ((s = malloc(sizeof(struct mystruct))) == NULL) { perror("malloc"); exit(EXIT_FAILURE); } s->cookie = 0; if (argc > 1) strcpy(s->buffer, argv[1]); if (s->cookie == 0x4242424242424242) { printf("Congratulations! You won a cookie!\n"); exit(EXIT_SUCCESS); } printf("Hello world!\n"); exit(EXIT_SUCCESS); }

Изменить работу процесса можно перезаписью элемента cookie структуры struct mystruct, расположенного справа после буфера в памяти со значением 0x4242424242424242 (в кодировке ASCII – BBBBBBBB).

Листинг 5. Перезапись элемента cookie
$ gcc -Wall -m64 -o example2 example2.c $ ./example2 AAAAAAAAAAAAAAAABBBBBBBB Congratulations! You won a cookie! $

На схеме 3 показаны структура struct mystruct и ее элементы в сегменте кучи после переполнения.

Схема 3. Структура struct mystruct после переполнения
Lesser Greater addresses addresses struct mystruct buffer cookie [AAAAAAAAAAAAAAAA][BBBBBBBB] Bottom of Top of heap heap

В начало

В следующей части

Мы лишь слегка коснулись поверхности. Во второй части я покажу вам, как перезаписывать указатели функций, и приведу ассемблерные компоненты и любопытные примеры кода для работы с оболочкой, сетью и сокетами.

Источник: http://www.ibm.com/developerworks/ru/library/l-lop...

Что эффективнее белковые или овощные диеты

Добавь свой комментарий

Введите символы с картинки

Приложения для iphone дюкан