Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
QEMU — это эмулятор различных процессорных архитектур. Как правило, он используется для эмуляции целого компьютера (то есть для запуска виртуальной машины), однако для отладки одной программы это необязательно. В Linux можно использовать эмуляцию QEMU User-Mode, именно этот способ и будет рассмотрен первым.
Наша конечная цель — запускать скомпилированные программы для ARM 64-bit. Для начала необходимо установить сам пакет эмулятора:
sudo apt-get update
sudo apt-get install qemu qemu-user qemu-user-static
Для AArch64 устанавливаем следующие компоненты:
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf binutils-arm-linux-gnueabihf-dbg
sudo apt install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg
Чтобы эмулировать процессор типа ARM64, необходимо создать две директории — deb11_inst
и deb11_start
: mkdir
. Затем перейти в deb11_inst
и скачать два файла — installer-linux
и installer-initrd.
.
Для этого используем следующие команды:
wget -Oinstaller-linux http://http.us.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
wget -Oinstaller-initrd.gz http://http.us.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz
Дальше создаем диск для установки на него системы:
qemu-img create -fraw hda.img 20G
Создаем файл instDebARM64.
, в него необходимо записать следующий скрипт:
qemu-system-aarch64 -Mvirt -m 2G -cpucortex-a53 -smp 2 -kernelinstaller-linux -initrdinstaller-initrd.gz -drive if=none,file=hda.img,format=raw,id=hd -devicevirtio-blk-pci,drive=hd -netdevuser,id=mynet -devicevirtio-net-pci,netdev=mynet -displaygtk,gl=on -devicevirtio-gpu-pci -no-reboot -deviceqemu-xhci -deviceusb-kbd -deviceusb-tablet
Здесь
qemu-system-aarch64
— эмуляция полной системы для архитектуры;-M
— выбор эмулируемой машины;-m
— объем ОЗУ;-cpu
— тип эмулируемого процессора;-smp
— количество виртуальных ядер ЦП и их распределение по сокетам;-kernel
— для использования указанного образа ядра Linux;-initrd
— для загрузки Linux;netdev/device
и drive
— описание сетевой карты и виртуальных дисков;if
— опция указывает, через интерфейс какого типа подключен диск;file
— определяет, какой образ использовать для какого диска;format
— указывает явным образ формат дисков, не использовать автоопределение;-display
— выбор типа отображения, доступно sdl
, curses
, gtk
, none
, vga
;-no-reboot
— отмена перезагрузки.Сохраняем и запускаем скрипт. Начнется классическая установка Debian 11. На первом экране надо выбрать английский язык в качестве основного.
Далее необходимо выбрать UNITED STATES. Ближе к завершению установки появится ошибка.
Выбираем Continue и дожидаемся окончания установки Debian. Переносим образ hda.
с установленной системой в директорию deb11_start
. Затем создаем файл debARM64.
, в который поместим следующий скрипт:
qemu-system-aarch64 -Mvirt -m 3G -cpucortex-a53 -smp 2 -kernelvmlinuz-5.10.0-8-arm64 -initrdinitrd.img-5.10.0-8-arm64 -append 'root=/dev/vda2' -drive if=none,file=hda.img,format=raw,id=hd -devicevirtio-blk-pci,drive=hd -netdevuser,id=mynet -devicevirtio-net-pci,netdev=mynet -displaygtk,gl=on -devicevirtio-gpu -no-reboot -deviceqemu-xhci -deviceusb-kbd -deviceusb-tablet
Щелкаем на созданном диске hda.
правой клавишей мыши и монтируем его: «Открыть с помощью –> Монтирование дискового образа». На смонтированном диске нас интересуют два файла: initrd.
и vmlinuz-5.
(ну а в общем случае initrd.
и vmlinuz-xxxxxxx-arm64
). Версии системы должны быть одинаковыми! Запускаем файл debARM64.
:
./debARM64
Для настройки сети в скрипт debARM64.
нужно добавить строчку -net
. Эта строчка создаст еще и SSH-подключение.
Есть и альтернативный вариант: эмуляция Raspberry Pi с использованием Docker. Для этого нужно установить Docker:
sudo apt-get install docker.io
Затем скачать соответствующий образ:
docker pull lukechilds/dockerpi
Как только все прогрузится, вводим команду
В качестве имя_для_контейнера
можно выбрать любое, я назову свой ap_security
. После этого начнется распаковка и запуск Raspberry Pi.
Итогом успешного запуска будет такое окно.
Учетные данные для входа в систему стандартны: pi:
. Собственно, всё. Теперь в нашей виртуальной лаборатории есть Raspberry Pi. Чтобы выключить устройство, используй команду sudo
, а чтобы запустить — docker
, где имя_для_контейнера
— выбранное тобой имя контейнера.
Установка GDB и плагина PEDA довольно проста. Для GDB используем команду
sudo apt install gdb
Для установки PEDA команды такие:
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >>~/.gdbinit
GEF установим командой
Отладку я буду выполнять в основном в GEF.
Чтобы написать программу на ассемблере, потребуются три инструмента:
Текстовый редактор — это вкусовщина. Многие пишут в Vim, мне удобнее в nano, поэтому код я буду писать там. Программа as создает объектный файл, а ld выполняет динамическую привязку. Работать с этими программами нужно следующим образом:
as source.asm -o source.o
, которая создает объектный файл с названием source.o
.ld source.o -o source.bin
.У любого файла с кодом на языке ассемблера должна быть точка, с которой начинается программа. Она выглядит так:
_start:
Эта точка определяется как глобальное имя для всей программы. Каждый оператор имеет следующий синтаксис:
<обозначение:> <инструкция> @ комментарий
В первой программе, по классике, реализован вывод приветственной строчки — H3ll0, ][
:
_start:
mov r7,#4
@ номер системного вызоваmov r0,#1
@ вывод - stdoutmov r2,#13
@ длина строкиldr r1,=string @ строка находится на метке string
swi 0
@ системный вызов
mov r7,#1
@ выходswi 0
.data
string:
.ascii "H3ll0, ][akep!n"
Здесь
r7
— номер процедуры;r0
определяет поток (stdin/stdout/stderr
);r2
— количество выводимых символов;r1
хранит адрес строки.Все это схоже с ассемблером для i386. В ARM регистры для взаимодействия такие:
r7
— номер системного вызова;r0
— аргумент 1;r1
— аргумент 2;r2
— аргумент 3;r3
— аргумент 4;r4
— аргумент 5;r5
— аргумент 6;r0
— возвращаемое значение или код ошибки.Информация обо всех системных вызовах есть в справке программы J0llyTr0LLz. Там же описано, что именно должно лежать в регистрах. Скачать программу и узнать, как с ней работать, можно на GitHub.
Компилируем приложение и запускаем.
as -gproga1.asm -oproga1.o
ld proga1.o -oproga1.bin
Здесь -g
— ключ для включения отладочной информации. После запуска увидим следующее:
$ file proga1.bin
proga1.bin: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
./proga1.bin
H3ll0, ][akep!
Попробуем продебажить это приложение.
Запускаем GDB и загружаем в него бинарный файл, после чего переходим к разделу start
:
$ gdb
gef➤ file proga1.bin
Reading symbols from proga1.bin...done.
gef➤ disassemble _start
Dump of assembler code for function _start:
0x00010074 <+0>: mov r7, #4
0x00010078 <+4>: mov r0, #1
0x0001007c <+8>: mov r2, #19
0x00010080 <+12>:
ldr r1, [pc, #8]
; 0x10090 <_start+28>
0x00010084 <+16>:
svc 0x00000000
0x00010088 <+20>:
mov r7, #1
0x0001008c <+24>:
svc 0x00000000
0x00010090 <+28>:
muleq
r2, r4, r0
End of assembler dump.
Поставим точку останова на первой инструкции и запустим программу:
b *_start
r
Окно отладки GDB-GEF выглядит так.
Шпаргалку по GDB-командам можно найти в документации, опубликованной на сайте Darkdust.
|
|