목차
0. MIPS란?
1. 파일 구조 분석
2. 함수 정리
3. 명령어 정리
참고
0. MIPS란?
1) Million Instructions Per Second, 컴퓨터 분야에서 컴퓨터의 연산 속도를 나타내는 단위
2) Microprocessor without Interlocked Pipeline Stages, MIPS Technologies에서 개발한 RISC 기반의 명령어 집합 체계(컴퓨터 아키텍처)
* CISC: Complex Instruction Set Computer, 연산에 처리되는 복잡한 명령어들을 수백 개 이상 탑재하고 있는 프로세서
* RISC: Reduced Instruction Set Computer, 하나의 명령어 실행으로 간단한 프로세스들을 신속하게 수행
MIPS, ARM
마이크로 프로세서 세계에서 사용할 수 있는 두 가지 ISA (명령어 세트 아키텍처), 레지스터의 한 유형
1. 파일 구조 분석
32bit로 명령어 주소들이 4byte 단위로 떨어진다면 MIPS는 RISC 구조
2. 함수 정리
strcoll() 함수
아래 나열된 것과 같이 관계를 나타내는 값을 리턴함
예제 | 값 | 반환값 |
strcoll(const char *string1, const char *string2); | string1이 string2보다 작음 | 0보다 작음 |
string1이 string2와 같음 | 0 | |
string1이 string2보다 큼 | 0보다 큼 |
if ( !strcoll(*a2, "UDP") ) : ① a2가 참조하는 값과 UDP가 같으면 → ② if (!0) 이므로 참 → ③ 다음 if문 수행 (∵ if 0은 거짓)
값이 다르면 result로 a1 반환
atol() 함수
정수 문자로 구성한 문자열, 부호와 정수 문자들을 long 형식 값으로 변환하여 반환함
3. 명령어 정리
어셈블리어 | 예제 | 의미 |
NOP | 아무 명령도 수행하지 않는 코드, 명령어 사이의 빈공간을 채워주는 역할 | |
LA | la $v0, 0x420000 | Load Address, 레지스터 $v0에 0x420000가 가리키는 주소 load |
ADDIU | addiu A B C | B + C의 값을 A에 삽입 |
BNEZ | bnez R, L | 레지스터 R이 0이 아니면 L로 점프 |
LW | lw $s3 n($0) | $0 주소에 n을 더해 주소가 0000000n인 곳의 데이터를 $s3에 삽입 |
$a1에 aCnc 값 삽입 (∵ $a1 = $v0 + (aCnc - 0x420000) = 0x420000 + (aCnc - 0x420000) = aCnc)
[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_73($fp) 와 같이 괄호가 있을 경우 $fp+(0x90+var_73) 와 같은 표현
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의 의미는 추가 파악이 필요
참고
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA] 분석 과정 단축키 모음 (0) | 2022.12.25 |
---|---|
[IDA Pro] chap.07 악성코드 정적분석 툴 사용법(AutoHotkey1, reversing.kr) (0) | 2022.10.06 |
[IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr) (0) | 2022.08.24 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF) (0) | 2022.08.06 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review) (0) | 2022.07.19 |