Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев, страница 8
Описание файла
PDF-файл из архива "Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
Куда именно будет помещено введенное число, и, какое значение увторого аргумента scanf, зависит от параметра i и не может быть определено только по заданному фрагменту кода.Значения регистров в указанные в условиях моменты времени приведены в таблице. После выполнения второй команды EBP будет указывать на место, где сохранено его прежнее значение. После вычитания ESP переместится на нижнее двойноеслово занятое фреймом функции (верхушка стека).Таблица 3. Значения регистров и адрес размещения переменной.ЗначениеРегистр EBP после команды №20xbfffff18Регистр ESP после команды №40xbffffef0Адрес размещения array0xbfffff00Пример 3-13 ЭксплойтПриведенная функция f и ее ассемблерная реализация содержат ошибки, которыепорождают эксплуатируемую уязвимость.Пусть в момент вызова функции f адрес возврата был размещен в стеке по адресу0xbffdb3cc.
Постройте такой эксплойт, чтобы в результате его обработки функция fвозвращала управление на адрес 0xdeadbeef.52#include <string.h>void f(char *in1, char *in2) {char *ptr;char buf[16];strcpy(buf, in1);strcpy(ptr, in2);}f:pushmovpushsubmovmovmovxormovmovleamovcallmovleamovcallmovxorjneaddpoppopret.L5:callebpebp, espebxesp, 36ebx, dword [ebp+12]eax, dword [gs:20]dword [ebp-8], eaxeax, eaxeax, dword [ebp+8]dword [esp+4], eaxeax, [ebp-28]dword [esp], eaxstrcpydword [esp+4], ebxeax, [ebp-12]dword [esp], eaxstrcpyeax, dword [ebp-8]eax, dword [gs:20].L5esp, 36ebxebp;;;;;;;;;;;;;;;;;;;;;;;;(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(21)(22)(23)(24)__stack_chk_fail; (25)РешениеКак и в предыдущей задаче, определим, как происходило распределение памятиво фрейме функции.
Помимо всего, компилятор поместил во фрейм функции «канарейку» – контрольное значение, которое будет затираться при переполнениимассива buf (Команды №6-8). Значение «канарейки» проверяется перед выходомиз функции (Команды №18-20). Если «канарейка» изменилась – управление передается на функцию, выполняющую аварийное завершение работы программы.«Канарейка» защищает от изменения адрес возврата, поскольку массив buf расположен ниже (ebp-28). Но указатель ptr расположен также ниже «канарейки» и егозначение может быть изменено в результате переполнения.
Для этого необходимозадать первый параметр в виде строки из 16 произвольных ненулевых байтов (вприведенном решении они выделены курсивом), а затем – адрес 0xbffdb3cc, по которому размещен адрес возврата. Байты адреса, как и любые другие целые числа,следует развернуть в обратном порядке (начиная с младших).
Важно, чтобы сразупосле адреса строка заканчивалась, т. к. в противном случае будет изменено значение «канарейки».53Второй вызов функции strcpy перепишет адрес возврата; в параметре in2 долженбыть задан адрес 0xdeadbeef, на который требуется передать управление. Поскольку других действий предпринимать не требуется, параметр in2 можно этим ограничить.in1ffffffffffin2efbeadde00ffffffffffffffffffffffccb3fdbf00ЗадачиЗадача 3-1В стеке записаны 20 указателей типа char* (последний из указателей находится навершине стека).
Не меняя состояние стека, обнулить значения по данным указателям.Задача 3-2В стеке записано 50 чисел типа int (последнее число находится на вершине стека).а) Среди этих чисел подсчитать количество чисел, имеющих равных «соседей»(предыдущее и последующее числа), и записать ответ в регистр EAX.б) Считая, что числа заносились в стек в порядке x1, x2, …, x50, записать в регистр EAX число 1, если последовательность x1, x2, …, x50 является возрастающей, или 0 в противном случае.54Состояние стека менять не разрешается.Задача 3-3 Максимум двух чиселТребуется реализовать функцию max, соответствующую прототипу intint b), которая возвращает максимальное значение своих параметров.Задача 3-4 Поменять местамиТребуется оформить функцию swap, соответствующую прототипуint *b), которая меняет значения своих аргументов.max(int a,void swap(int *a,Задача 3-5 Восстановить объявление функцииТело Си-функции f имеет следующий вид:*p = d;return x-a;Этому телу соответствует следующий ассемблерный код.movsxmovmovmovsxmovsubmovedx, byte [ebp + 12]eax, dword [ebp + 16]dword [eax], edxeax, byte [ebp + 8]edx, dword [ebp + 20]edx, eaxeax, edxТребуется восстановить прототип функции f.Задача 3-6Реализовать функцию с прототипомдачи:int f(unsigned n)для решения следующей за-а) функция возвращает значение 1, если количество единиц в двоичном представлении числа n превышает количество нулей;б) функция возвращает значение 1, если в двоичном представлении числа nимеется 5 стоящих подряд единиц.Реализация должна удовлетворять соглашению cdecl.Задача 3-7Описать функцию int max(short *a, unsigned n), которая возвращает в качестве результата значение максимального элемента массива a из n элементов.
Функциядолжна удовлетворять соглашению cdecl.55Задача 3-8 ФакториалРеализовать в виде функции вычисление факториала.Задача 3-9 Только рекурсияОписать рекурсивную функцию для решения следующих задач. Функция должнаудовлетворять соглашению cdecl:1. На входном потоке задан текст в виде последовательности символов, заканчивающейся точкой.а) Вывести символы текста в обратном порядке.б) Подсчитать количество вхождений цифр в указанный текст.2. На входном потоке задана последовательность ненулевых чисел типа int(признаком окончания последовательности является число 0).
Вывести сначала все отрицательные числа этой последовательности, а затем все остальные (в любом порядке).3. Для числа unsigned n найти:а) Сумму цифр в его десятичной записи.б) Максимальное значение цифры в его десятичной записи.Задача 3-10 Выравнивание стекаТребуется должным образом оформить функцию CMAIN для последующего вызовафункций стандартной библиотеки.
Необходимо выровнять стек по границе 16 байтов.Задача 3-11 «Сколько время»Требуется напечатать на стандартный вывод текущее время. Пример вывода:Tue Mar 29 23:00:33 2011Указание: воспользуйтесь функциями стандартной библиотеки языка Си:#include <time.h>time_t time(time_t *timer);char *ctime(const time_t *timer);Задача 3-12Реализовать функцию стандартной библиотеки языка Си memcpy в соответствии с соглашением cdecl.void *memcpy(void *destination, const void *source, size_t num);56Функция memcpy не допускает пересечение между областями памяти, указываемыми в source и dest. Примечание: Тип size_t — 32-битное беззнаковое целое.Задача 3-13Реализовать функцию стандартной библиотеки языка Сисоглашением cdecl.memmoveв соответствии сvoid *memmove(void *destination, const void *source, size_t num);Функция memmove допускает пересечение между областями памяти, указываемымив source и dest.Задача 3-14Написать полную программу на языке ассемблера, которая вводит с клавиатурыдва целых числа (int) и выводит:а) максимальное из этих чисел;б) среднее арифметическое этих чисел.Для ввода/вывода использовать функции стандартной библиотеки языка Си: scanfи printf.
Для расположения вводимых чисел использовать стек. Обеспечить выравнивание стека в функции main.Задача 3-15Написать полную программу на языке ассемблера, которая вводит с клавиатурыцелое число (int), вычисляет его абсолютное значение и выводит его. Программадолжна использовать функции стандартной библиотеки языка Си: scanf, abs иprintf. Вводимое число расположить в стеке. Обеспечить выравнивание стека вфункции main. Прототип функции abs имеет вид int abs(int n);Задача 3-16Реализовать функцию strpfx, которая возвращает длину наибольшего общего префикса строк s1 и s2, в соответствии с соглашением cdecl. Строки:а) не могут полностью совпадать;б) могут полностью совпадать.size_t strpfx(const char *s1, const char *s2);Примечание: данная функция не входит в стандартную библиотеку языка Си.57Задача 3-17При компьютерной обработке звука используется дискретное представление звукового сигнала: звук рассматривается как массив дискретных сэмплов (моментальных значений амплитуды), снятых с источника с определённой частотой (частотадискретизации).
Эти значения могут храниться, например, в виде знаковых 8разрядных целых чисел.Таким образом, монофонический звук может быть представлен массивом signedchar *M, где M[i] — значение амплитуды в момент времени i*T, где T — периоддискретизации.Стереофонический звук, как правило, представляется в «переплетённом» (interleaved) формате: в массиве signed char *S чётные элементы соответствуют амплитуде в левом канале, а нечётные — в правом.
Иными словами, для одного и тогоже стереофонического звука, представленного в таком формате и в виде двух монофонических массивов L и R верны соотношения:S[0]S[1]S[2]S[3]...S[i]========L[0];R[0];L[1];R[1];== (i % 2 ? R : L)[i / 2];Требуется реализовать функции преобразования:а) двух монофонических сигналов для левого и правого уха L и R в interleavedstereo S;б) interleaved stereo сигнала S в два монофонических L и R./* Преобразование из L и R в S. Число сэмплов передаётся в n. */voidinterleave(size_t n, const signed char *L, const signed char *R,signed char *S);/* Преобразование из S в L и R. Число сэмплов передаётся в n.voiddeinterleave(size_t n, const signed char *S, signed char *L,signed char *R);*/Задача 3-18C использованием функции стандартной библиотеки языка Си qsort реализуйте:а) функцию с прототипом void sort1(int *x, int n), сортирующую по неубыванию массив x, в котором содержатся n целочисленных значений;58б) функцию с прототипом void sort2(unsigned long long *x, int n), сортирующую по невозрастанию массив x, в котором содержатся n целочисленныхзначений;в) функцию с прототипом void sort3(char **x, int n), сортирующую в лексикографическом порядке массив строк x длины n с использованием библиотечной функции strcmp.Задача 3-19Измените решение Примера 3-9 таким образом, чтобы в теле цикла, выполняющего копирование данных, вместо команды POP использовалась команда PUSH.Задача 3-20Функция g и ее ассемблерная реализация содержат ошибки, которые порождаютэксплуатируемую уязвимость.Пусть в момент вызова функции g адрес возврата был размещен в стеке по адресу0xbfc1d80c.