MIPS Assembly 정리

공유기 취약점 분석 중, 펌웨어의 CGI가 MIPS로 되어 있길래 (Hex-Ray도 안됨) 공부 겸 적어 놓는다.


ARM과 비슷한 것 같지만, ARM은 i386 Linux Assembly랑 명령어 작명이 비슷하기라도 했지, 이건 생판 처음 보는 분들이 맞이해 주신다.




Registers


 레지스터 번호

 호출명

 용도

 $0

 $zero

 항상 Zero로 고정되어 있음

 $1

 $at

 Assembler Temporary 레지스터 (명령 내 임시값)

 $2 ~ $3

 $v0, $v1

 반환 값 레지스터

 $4 ~ $7

 $a0 ~ $a3

 인자 레지스터

 $8 ~ $15

 $t0 ~ $t7

 임시 레지스터 (subprogram 호출 중 보존X)

 $16 ~ $23

 $s0 ~ $s7

 저장되는(?) 레지스터 (subprogram 호출 중 보존O)

 $24 ~ $25

 $t8 ~ $t9

 임시 레지스터 확장 Ver.

 $26 ~ $27

 $k0 ~ $k1

 커널 레지스터

 $28

 $gp

 전역 포인터

 $29

 $sp

 스택 포인터

 $30

 $fp

 프레임 포인터

 $31

 $ra

 리턴 주소

 $f0 ~ $f3

 

 부동 소수점 포인터 (Floating point return values라고 적혀있다.)

 $f4 ~ $f10

 

 임시 레지스터

 $f12 ~ $f14

 

 subprogram에 전달되는 처음 두개의 인자값을 담는 레지스터

 $f16 ~ $f18

 

 임시 레지스터 확장

 $f20 ~ $f31

 

 저장되는 레지스터 (subprogram 보존O)





Instructions


MIPS 명령은 3가지 종류가 있다.

R (Register) / I (Immediate) / J (Jump)


R type의 명령은 사용하는 모든 Operand가 register인 명령을 일컫는다.

R type의 명령은 아래와 같이 이루어져 있다.

opcodersrtrdshift (shamt)funct
6 bits5 bits5 bits5 bits5 bits

6 bits

rs, rt = source register 1, 2 (source / target)

rd = destination register



I type의 명령은 사용하는 Operand가 즉치값(immediate value) 과 register로 이루어 져 있는 명령을 일컫는다.

I type의 명령은 아래와 같이 이루어져 있다.

opcodersrtIMM
6 bits5 bits5 bits

16 bits

IMM(즉치값)은 최대 16bit로 제한되어 있고, 더 큰 값을 사용하려면 추가적인 과정이 필요하다.



J type의 명령은 jump가 필요할 때 사용되는 명령을 일컫는다.

J type의 명령은 아래와 같이 이루어져 있다.

OpcodePseudo-Address
6 Bits26 Bits


FR FI 명령도 있긴 하지만, 부동 소수점 숫자로 사용된다는 점 외에는 차이점이 없다.



Arithmetic Instructions

일반적인 산술에 사용되는 명령어들이다.

($r 은 레지스터 값, $i는 즉치값, $a는 주소값으로 서술한다.)


add $rd, $rs, $rt -> rd = rs - rt

addu $rd, $rs, $rt -> 상기 동일, unsigned 취급


sub $rd, $rs, $rt -> rd = rs - rt

subu $rd, $rs, $rt -> 상기 동일, unsigned 취급


mult $rd, $rs, $rt -> rd = rs * rt

multu $rd, $rs, $rt -> 상기 동일, unsigned 취급


div $rd, $rs, $rt -> rd = rs / rt (몫은 하위 32bit / 나머지는 상위 32bit)

divu $rd, $rs, $rt -> 상기 동일, unsigned 취급


and $rd, $rs, $rt -> rd = rs & rt

or $rd, $rs, $rt -> rd = rs | rt

nor $rd, $rs, $rt -> rd = !(rs | rt)

xor $rd, $rs, $rt -> rd = rs ^ rt


addi $rd, $rs, $i -> rd = rs + i

addiu $rd, $rs, $i -> 상기 동일, unsigned 취급

(subi 명령은 존재하지 않는다. addi 명령의 즉치값에 음수를 주면 된다고 함)


andi $rd, $rs, $i -> rd = rs & i

ori $rd, $rs, $i -> rd = rs | i

xori $rd, $rs, $i -> rd = rs ^ i


추가 예정





'# Programming > Assembly' 카테고리의 다른 글

MIPS Assembly 정리  (0) 2018.08.02
blog image

Written by NoneType

Pwnable Newbie

HackTheBox Ropme Write-Up

2018.07.19 20:20

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.