임베디드에서 주로 사용됨.
RISC 구조를 가짐.
=> RISC 란, 명령어 길이가 축약되어 나타나, 명령어 길이가 일정함. => 보다 빠른 명령어 해석이 가능
Pipe Line : Arm 에서 명령어를 처리하는 과정.
(출처 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0210c/CACDBGEG.html)
다음과 같이 Fetch -> Decode -> Execute 순서임.
Fetch : 명령어를 메모리에 적재
Decode : 명령어를 해석
Execute : 명령어를 실행
이와 같은 과정으로 명령어를 실행하는데, Arm 에서는 한 명령어를 실행 할 떄, 그 다음주소는 해석중이고, 그 다음 주소는 적재를 한다.
STR R3, [R11,#var_10]
LDR R3, [R11,#s] <= Fetch
LDRB R2, [R3] <= Decode
LDR R3, [R11,#s] <= execute
ADD R3, R3, #5
이런 방식으로 실행을 한다.
레지스터
(출처 : https://community.arm.com/processors/b/blog/posts/how-to-call-a-function-from-arm-assembler)
arm user mode 에서는 기본적으로 16개의 레지스터를 지원.
r0 ~ r12 : 범용 레지스터
r0 : 함수의 리턴값으로 사용
r0 ~ r3 : 함수 인자 전달
r13 : SP, 스택 포인터, 스택 최상단을 가리킴
r14 : LR, 링크 레지스터, 서브 루틴후 돌아갈 주소 저장
r15 : PC, 프로그램 카운터, 현재 fetch 중인 주소, execute중인 주소의 다다음 주소.
CPSR
(출처 : https://letsembed.wordpress.com/2013/12/26/short-note-on-processor-modesarm/)
i386의 eflags 같은 레지스터.
Negative/Less : 실행결과가 음수일 경우
Zero : 연산 결과가 0 일경우
Carry/Borrow/Extend : 연산 결과에서 자리올림이 발생했을 경우
OVerflow : 연산 결과에서 overflow 가 일어났을 경우
명령어
ADD Rd, Rn, Op2
ADD : 명령어 ( SUB, BL, ... )
Rd : Destination Register
Rn : Operand1, 항상 레지스터
Op2 : Operand2, 상수 가능, ( # 을 붙임 )
ADD r0, r1, r2 => r0 = r1 + r2
접미사
CPSR레지스터의 플래그 따라 명령어 수행
ADDEQ r0, r1, r2 => if (ZF) r0 = r1 + r2
ADDS r0, r1, r2 => r0 = r1 + r2, Set condition flags
EQ : ZF Set
NE : ZF Clear
GE : NF == VF
LT : NF != VF
GT : ZF Clear & NF == VF
LE : ZF Set & NF != VF
S : 수행 후 CPSR레지스터 플래그 세팅
명령어 종류
산술 ( <Operation>{<cond>}{S} Rd, Rn, Op2 )
ADD : Rd = Rn + Op2
SUB : Rd = Rn - Op2
MUL : Rd = Rn * Op2
비교( <Operation>{<cond>} Rn, Op2 )
CMP : Rn - Op2
TST : Rn & Op2
연산 결과에 따라 CPSR 플래그 세팅
논리 연산( <Operation>{<cond>}{S} Rd, Rn, Op2 )
AND : Rd = Rn & Op2
EOR : Rd = Rn ^ Op2
ORR : Rd = Rn | Op2
데이터 이동 ( 메모리 접근 X ) ( <Operation>{<cond>}{S} Rd, Op2 )
MOV : Rd = Op2
MVN : Rd = ~Op2
레지스터, 상수만 사용 가능
데이터 이동 ( 메모리 접근 O ) ( <Operation>{<cond>}{B, H}{S} Rn, Op2 )
LDR : Rn = Op2 ( 메모리 )
STR : Op2 = Rn ( 메모리 )
LDR r0, r1 => r0 = *r1
LDR r0, =0xdeadbeef => r3 = *0xdeadbeef
STR r1, [r2, #11] => *(r2 + 11) = r1
분기( <Operation> {<cond>}{S} Label(function) )
B : Jump Label
BL : Jump Label, LR = BL 다음주소
배럴 쉬프트( <Operation> {<cond>}{S} Rd, Rn, Op2, {<Barrel>} Shift )
LSL : Op2 = Op2 << Shift
LSR : Op2 = Op2 >> Shift
명령어 사이 낑겨서 사용함.
ADD r1, r2, r3, LSL #3 => r1 = r2 + (r3 << 3)
SUB r1, r2, r3 LSR #2 => r1 = r2 - (r3 >> 2)
'Analysis' 카테고리의 다른 글
Pwntools 기본적인 사용법 - 4 (0) | 2018.04.06 |
---|---|
Automatic Exploit Generation (1) | 2018.01.08 |
HTTP 프로토콜 구조 (0) | 2017.12.11 |
syscall 을 이용한 rop (3) | 2017.11.06 |
Pwntools 기본적인 사용법 - 3 (1) | 2017.10.20 |