Profile

머리정리하는곳

c2w2m2

Arm 아키텍쳐

임베디드에서 주로 사용됨.


RISC 구조를 가짐.

 => RISC 란, 명령어 길이가 축약되어 나타나, 명령어 길이가 일정함. => 보다 빠른 명령어 해석이 가능


Pipe Line : Arm 에서 명령어를 처리하는 과정.


F e t c h D e c o d e E x e c u t e I n s t r u c t i o n f e t c h e d f r o m m e m o r y D e c o d i n g o f r e g i s t e r s u s e d i n i n s t r u c t i o n R e g i s t e r ( s ) r e a d f r o m r e g i s t e r b a n k S h i f t a n d A L U o p e r a t i o n W r i t e r e g i s t e r ( s ) b a c k t o r e g i s t e r b a n k

(출처 : 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