-
[MIPS] MIPS 기본 내용 정리# 시스템 해킹 공부중 2018. 3. 28. 00:48
[MIPS Register]
$0 = Always 0
$at = The Assembler Temporary used by the assembler in expanding pseudo-ops.
$v0, $v1 = 리턴값 저장. 1 word 인 경우 $v0 만 사용. 초과할 경우 $v1 과 나눠서 저장
$a0-$a3 = 함수 인자값 저장. 초과할 경우 스택에 저장
$t0-$t9 = 임시 저장 레지스터
$s0 - $s7 = 저장 용 레지스터 – 함수 호출 중 불변
$k0, $k1 = 커널에서 사용하는 레지스터
$gp = 전역 포인터 레지스터
$sp = 스택 포인터
$fp = 함수 프레임 포인터 ($s8)
$ra = 서브루틴 호출 시 반환 주소 저장
[MIPS 주요 명령어]
addiu [addiu A B C] = [A <- B + C]
sw [sw A B] = [A ->B]
lw [lw A B] = [A <- B]
li(load immediate) [li A B] = [A <- B]
move [move A B] = [A <- B]
movn [movn A B C] = [if C != 0 then A <- B]
la [la A B] = [A <- B’s Addr]
lb [lb $a, (0)$s0] = $a 에 byte 단위로 데이터 로드
sb [sb $a, (100)$s0] = *($s0 + 100) 에 $a 저장
jal [jal A] - 다음 명령어의 주소를 $ra에 저장하고, A로 점프
bal [bal function] = function call = jalr
beq [beq A B L] = A와 B가 같으면 L로 점프
beqz [beqz R L] = R이 0이면 L로 점프
bne [bne A B L] = A와 B가 다르면 L로 점프
bnez [bnez R, L] = 레지스터 R이 0이 아니면 L로 점프
lui [lui A, 0x47] = A 레지스터 상위 2byte에 0x47 저장
0x90+var_74($fp) 와 같이 괄호가있을 경우 $fp+(0x90+var_74) 와 같은 표현이다.
slt [slt rd, rs, rt] = rd <= (rs < rt) ? 1 : 0
sll [sll $a, 1] = $a << 1
[MIPS 함수 호출 과정]
$ra 에 caller 의 return address 저장 (마지막 호출 함수의 경우 저장 안할 수 있음)
$a0 ~ $a3 에 인자값 저장 인자가 4개를 초과할 경우 초과한 만큼 스택에 저장
func(param1, param2, param3, param4) 일 경우 $a0 = param1, $a1 = param2, $a2 = param3, $a3 = param4 가 들어간다.
bal, jal, jalr 등 으로 함수 호출
return 값은 $v0 (4byte 초과시 $v1 에 나눠서 저장)
호출시 $ra 값 스택에 백업
$s0 ~ $s7도 필요한 경우 스택에 백업
$s8 레지스터와 $sp에 같은 값이 저장되어 있어서 $s8의 의미를 아직은 잘 모르겠음
addiu $sp, -0x90
sw $ra, 0x90+var_4($sp)
sw $fp, 0x90+var_8($sp)
move $fp, $sp
[프롤로그]
move $sp, $fp
lw $ra, 0x90+var_4($sp)
lw $fp, 0x90+var_8($sp)
addiu $sp, 0x90
jr $ra
[에필로그]
'# 시스템 해킹 공부중' 카테고리의 다른 글
[안드로이드] 안드로이드 앱 실시간 패킷 캡쳐 및 분석 with mitmproxy, Wireshark (6) 2019.10.09 pwntools gdb.attach 사용법 - python process debugging (2) 2019.08.05 가상함수(Virtual function)와 가상함수테이블(vtable)의 이해 (9) 2019.07.17 [MIPS] strcmp (0) 2018.04.04 Ubuntu MIPS ARM 크로스 컴파일 환경 구성 (2) 2018.03.28