singi@hackerschool Facebook : @sjh21a
http://kernelhack.co.kr/netsec-singi.zip
- First Phase About ARM ARM Operating Mode and Registers Basic ARM Instruction Thumb Mode - Second Phase Configuration of Reverse Engineering Function Calling Convention Analysis C Syntax to ARM Assembly Real world Example #1 for third party app Real world Example #2 for Default Browser Reference
ARM CPU 의동작모드 ARM CPU 의 Register 와용도 자주사용되는 ARM Instruction 습득 ARM CPU 만의특징파악 ARM Assembly 예제
ARM is Advanced RISC Machine 32비트의명령어로구성되어있음. (ARM 서버용으로 64비트출시됨 ) RISC는명령어가 CISC보다간단하고, 수가적음. (x86 계열은 CISC 사용 ) ARM Core? ARM Processor? ARM Architecture / Processor 종류 Architecture v4 v5te v5tej v6 v7 Processor ARM7TDMI, ARM720T, ARM940T, ARM920T, ARM922T ARM946E-S, ARM926E-S, Xscale ARM926EJ-S ARM1136JF-S Cortex A, M, R T : Thumb, D : Debug Port (JTAG), M : 8 비트곱셈기, I : Break Point 나 Watch Point 설정가능, D 와사용. -E : DSP 연산명령어추가, -S : VHDL, Verilog 로회로도가제공됨. -J : Java Byte code 해석가능.
ARM Operating Modes Mode 설명 Supervisor(SVC) Reset 이나 SWI 명령이실행될때 Privileged mode FIQ IRQ Abort Undefined System Fast Interrupt가발생되었을때일반적인 Interrupt가발생되었을때 Data 나 instruction fetch에실패할때정의되지않은 instruction일때 User 모드와같지만, 특권모드임 User 응용프로그램이나 OS 실행할때 Unprivileged mode Privileged mode 에선 Interrupt 의사용유무설정가능 Privileged mode 에선서로변경이자유롭지만, Unprivileged mode 에선변경이불가능함.
Example #1 User mode MOV R8, #1 MOV R9, #2 FIQ 발생 FIQ Mode MOV R8, #0 MOV R9, #0 ADD R10, R8, R9 복귀 R10 에저장되는값은?
R0 ~ R12 : 일반연산및임시저장장소등으로사용. R13 Stack Pointer (SP) 동작모드별로별도로존재함. R14 Link Register (LR) 함수호출시리턴될주소를가지고있음 동작모드별로별도로존재함. 스택에접근해서 Return Address 에접근하는것은레지스터보다상대적으로느림. R15 Program Counter (PC) 다음에실행될명령어를가지고메모리로부터가지고옴. 모드별로별도로존재하지않고, 하나의 R15 레지스터만존재함. CPSR Program Status Register (CPSR) Mode 가변경되면 H/W 적으로변경되기전의 CPSR 이 SPSR(Saved ) 에저장됨. User/System Mode 를제외하고각모드마다하나씩존재함.
CPSR Register 구조 31 30 29 28 27 24 8 7 6 5 4 0 N Z C V Q J Reserved I F T M Flag Field Status Field Extension Field Control Field Flag Field Control bits Mode bits N 연산결과가마이너스인경우에 set I 1 인경우 : IRQ 비활성화 10000 User Z 연산결과가 0 인경우에 set F 1 인경우 : FIQ 비활성화 11111 System C 연산결과에자리올림이발생했을때 set T 1 인경우 : Thumb, 0 인경우 : ARM 10001 FIQ V 연산결과가 overflow 됐을경우 set 10010 IRQ Q 포화가발생되면 set, 반드시 clear 10011 SVC J 자바바이트코드실행상태 10111 Abort 11011 Undefined
32bit ARM Instruction 구분 1 분기명령 B, BL 명령어 2 데이터연산명령 ADD, ADC, SUB, SBC, RSB, RSC, AND, ORR, BIC, MOV, MVN, CMP, CMN, TST, TEQ 3 Multiply 명령 MUL, MLA, SMULL, SMLAL, UMULL, UMLAL 4 Load/Store 명령 LDR, LDRB, LDRBT, LDRH, LDRSB, LDRSH, LDRT STR, STRB, STRBT, STRH, STRT 5 Load/Store Multiply 명령 LDM, STM 6 Swap 명령 SWP, SWPB 7 Software Interrupt 명령 SVC ( 기존 SWI 에서변경 ) 8 PSR 전송명령 MRS, MSR 9 Co-Processor 명령 MRC, MCR, LDC, STC 10 Branch Exchange 명령 BX 11 ARM Architecture 별로명령어들이추가존재.
MOV R0, #31337 MOV R0, R1 Op-code Destination Register Source Register ARM 은메모리내에직접데이터를쓰거나, 가져올수없음! 특정명령을통해메모리값을레지스터에가져오거나, 레지스터값을메모리에써야함. (LDR, STR 명령어 ) 이것은 RISC 구조의대표적인특징이고, Load/Store 구조라함. 또한, 32 비트상수값은 Operand 로사용할수없음.
조건부실행 {<cond>} 파이프라인구조를가지는 CPU의지연을줄이기위한것. 명령어의조건필드와 CPSR Register의 N, Z, C, V값을비교하여수행됨. 접미사 CPSR Flag 의미 EQ Z Flag set 같다. NE Z Flag Clear 같지않다. CS C Flag Set 크거나같다.(unsigned) CC C Flag Clear 작다 (unsigned) MI N Flag Set 음수 PL N Flag Clear 양수또는 0 VS V Flag Set 오버플로우발생 VC V Flag Clear 오버플로우 X HI C Flag Set, Z Flag Clear 크다.(Unsigned) LS C Flag Clear 작다.(Unsigned) GE N Flag = V Flag 크거나같다. LT N Flag!= V Flag 작다 GT Z Flag Clear AND (N = V) 크다 LE Z Flag Set OR (N!= V) 작거나같다 AL Ignore 무조건실행
산술연산명령어형식 Operation{<cond>} {s} Rd Rn Operand2 Operation ADD, SUB, ADC, 등 {<cond>} 조건부실행을위한조건 {s} 연산결과로부터 CPSR Register의 Flag를 set 함. Rd Destination Register Rn Source Register 산술연산명령어예제 ADD R0, R1, R2 R1 과 R2 을더하여 R0 에저장. SUBEQ R0, R1, #8 EQ조건이면, R2에서 8을빼서, R0에저장하고, 결과에따라 CPSR Flag를설정함. ADDS R1, R2, R0 R2 과 R0 를더하여 R1 에저장하고, 결과에따라 CPSR Flag 를설정함.
논리연산명령어형식 Operation{<cond>} {s} Rd Rn Operand2 Operation AND, ORR, EOR, BIC {<cond>} 조건부실행을위한조건 {s} 연산결과로부터 CPSR Register의 Flag를 set 함. Rd Destination Register Rn Source Register 논리연산명령어예제 AND R0, R1, R2 R1 과 R2 을 AND 연산하여 R0 에저장. ANDEQS R0, R1, R2 EQ 조건이면, R1 과 R2 를 AND 연산하여 R0 에저장하고, 결과에따라 CPSR Flag 를설정함. BICLE R1, R2, R0 LE 조건이면, R2 와 R0 를 XOR 하고결과를 R1 에저장.
비교명령어형식 Operation{<cond>} Rn Operand2 Operation CMN, CMP, TEQ, TST {<cond>} 조건부실행을위한조건 Rn Source Register Destination Register 가존재하지않음. CPSR Flag 를설정하기위한명령이없어도항상설정함. 비교명령어예제 CMP R0, R1 R1 과 R2 를비교하여, 그결과로 CPSR 에 Flag 설정. TSTEQ R2, #8 EQ 조건이면, R2 와 #8 을비교후, 결과로 CPSR Flag 설정. CMN LE 조건이면, R2 와 R0 를 XOR 하고결과를 R1 에저장.
MOVE 명령어형식 Operation MOV, MVN {<cond>} 조건부실행을위한조건 Rd Destination Register Operation{<cond>} Rd Operand2 Source Register 가존재하지않음. MOV R0, R1 R1 을 R0 로옮긴다. 비교명령어예제 MOVLE R0, R2 LE 조건이면, R2 를 R0 로옮긴다. MVN R0, R2 R2 XOR 0xFFFFFFFF 한값을 R0 에옮긴다. (Negative 로변경 )
분기명령어형식 B{L} {cond} <expression> {L} Branch with link 로 R14 에 PC 값을저장함. {<cond>} 조건부실행을위한조건 <expression> 위치정보 비교명령어예제 BL somewhere Somewhere로분기, LR에돌아올주소저장. ( 함수호출에사용 ) 함수호출후, 되돌아갈때, MOV PC, LR 사용함. B somewhere Somewhere 로분기 BL somewhere+1 계산된위치로분기. CMP R1, #0 BEQ success R1 이 0 이면 (EQ 조건이면 ) success 로분기.
데이터전송명령어형식 Pre-index 방식 LDR STR {cond} {B} Rd [Rn, <offset>] {!} {cond} 조건부실행을위한조건 {B} Unsigned Byte 단위의 Access 를할때사용됨. Rd LDR 의경우 Destination Register 가되고, STR 의경우 Source Register 로사용됨. Rn Base Register 로사용됨. Offset 12 비트상수또는레지스터가올수있음. {!} Pre-Index 방식에서 Base Register 값을자동으로업데이트할때사용됨. 데이터전송명령어형식 Pre-index 방식 LDR R1, [R2, R4] R2+R4 위치에서데이터를워드만큼읽어서, R1 에저장. LDR R1, [R2, R4]! R2+R4 위치에서데이터를워드만큼읽어서, R1 에저장. 전송후, R2 의값은 R2+R4 값으로변경됨. STR R1, [R2, R4] R1 값을 R2+R4 위치에워드만큼저장함. LDR R1, [R2, #8] R2+8 위치에서워드만큼읽어서 R1 에저장함.
데이터전송명령어형식 Post-index 방식 LDR STR {cond} {B} {T} {cond} 조건부실행을위한조건 {B} Unsigned Byte 단위의 Access 를할때사용됨. {T} 데이터전송시에 Unprivileged mode 로전송함. Rd LDR 의경우 Destination Register 가되고, STR 의경우 Source Register 로사용됨. Rn Base Register 로사용됨. Offset 12 비트상수또는레지스터가올수있음. Rd Rn offset 데이터전송명령어형식 Post-index 방식 LDR R1, [R2], #4 R2에서워드만큼읽어서 R1에저장후, R2+4값으로 R2 변경함. LDR R1, [R2], R4 R2에서워드만큼읽어서 R1에저장후, R2+R4 값으로 R2 변경함. STR R1, [R2], R4 R1 값을 R2 위치에워드만큼저장후, R2+R4 값으로 R2 변경함.
데이터전송명령어형식 PC-Relative 방식 LDR {cond} 조건부실행을위한조건 {size} Unsigned Byte 단위의 Access 를할때사용됨. Rd Destination Register. Label PC 위치에서 4K byte 내에있는 Label 참조 =DATA 32 비트데이터를레지스터에쉽게넣기위한어셈블러기능. LDR R1, label label: DCD 0xdeadbeef {cond} {size} Rd 데이터전송명령어형식 PC-Relative 방식 Label 위치에서데이터 0xdeadbeef 를워드만큼읽어서, R1 에저장. LDR R1, =0xdeadbeef 데이터 0xdeadbeef 를 R1 에저장한다. Label =DATA
다중데이터전송명령어형식 STM {cond} 조건부실행을위한조건 {addressing mode} 어드레스를만드는방법을나타냄. Rn Base Register 로이위치로부터데이터가저장.! 데이터전송후, Base Register 를변경한다. {register_list} 저장할데이터를가지고있는레지스터. {cond} <addressing mode> Rn{!} <register_list> 다중데이터전송명령어형식 STMIA R0, {R1,R2,R3} R1,R2,R3 데이터를 R0 위치부터저장함. STMIA R0!, {R1,R2,R3} R1,R2,R3 데이터를 R0 위치에저장하고, R0 값에 12 가더해짐. 12 = R1(4) + R2(4) + R3(4)
다중데이터전송명령어형식 LDM {cond} 조건부실행을위한조건 {addressing mode} 어드레스를만드는방법을나타냄. Rn Base Register 로이위치로부터데이터가읽혀짐.! 데이터전송후, Base Register 를변경한다. {register_list} 저장할데이터를가지고있는레지스터. ^ Privileged mode 에서 CPSR 를복원. {cond} <addressing mode> Rn{!} <register_list>^ 다중데이터전송명령어형식 LDMIA R0, {R1,R2,R3} R0 위치에서데이터를차례대로읽은후, 각각 R1, R2,R3 에저장. LDMIA R0!, {R1,R2,R3} R0 위치에서데이터를차례대로읽은후, 각각 R1, R2, R3 에저장, 그후, R0 에 R1(4)+R2(4)+R3(4) 가증가. LDMIA R0, {R0-R7} R0 위치에서데이터를읽은후, R0~R7 까지각각저장. LDMIA R0!, {R0-R2, PC} R0 위치에서데이터를읽은후, R0~R2 까지그리고 PC 에저장.
ARM<->Thumb mode 명령어 (Inter-working) BLX {cond} Rm {cond} 조건부실행을위한조건 Rm 분기하고자하는주소정보와변환하고자하는상태정보가저장. Label PC-relative 방식으로분기, 반드시조건없이사용해야하고, 무조건 Thumb 로전환됨. BLX Label Inter-working 명령어형식 BLX thumb_func thumb_func로분기하고, Thumb mode로전환하고 R14 Register에돌아올주소저장. BLXEQ R0 EQ조건이면, R0가지정하는위치로분기하고, 상태정보에따라 상태를전환하고, R14 Register에돌아올주소저장.
Software Interrupt 명령어형식 SVC {cond} <expression> {cond} 조건부실행을위한조건 <expression> 인터럽트번호 Software Interrupt 명령어형식 SWI 0x80 CPSR을 SPSR_svc에저장후, PC를 0x08(SWI의예외처리 Handler) 로분기후, 0x80을보고정의된동작실행.
ARM<->Thumb mode 명령어 (Inter-working) BLX {cond} <addressing mode> Rn{!} <register_list>^ {cond} 조건부실행을위한조건 Rm 분기하고자하는주소정보와변환하고자하는상태정보가저장. Label PC-relative 방식으로분기, 반드시조건없이사용해야하고, 무조건 Thumb 로전환됨. Inter-working 명령어형식 BLX thumb_func thumb_func로분기하고, Thumb mode로전환하고 R14 Register에돌아올주소저장. BLXEQ R0 EQ조건이면, R0가지정하는위치로분기하고, 상태정보에따라 상태를전환하고, R14 Register에돌아올주소저장.
.global _start _start: MOV r0, #1 MOV r1, pc ADD r1, #24 MOV r2, #13 MOV r7, #4 SVC 1 SUB r0, r0, r0 MOV r7, #1 SVC 1.ascii "Hello NetSec\n"
Thumb mode 도입이유 기존 ARM 명령을사용하여만들어진바이너리보다크기가약 75% 적음. (Thumb-2) 크기가적어지면, Flash나 Rom 같은저장장치의단가를줄일수있음. 16비트메모리인터페이스를사용하면, 가격과전력소모를줄일수있음. ARM Mode Thumb Mode 명령어크기 32bit 16bit 사용 Register 수 R0~R15 R0~R7 조건부실행가능 가능 불가 실행파일크기 100% 65%
.global _start _start:.code 32 ADD r3, pc, #1 BX r3.code 16 MOV r0, pc ADD r0, #10 STR r0, [sp, #4] ADD r1, sp, #4 SUB r2, r2, r2 MOV r7, #11 SVC 1.ascii "/system/bin/sh"
Crackme.apk
APK-Multi-Tool 을이용해디컴파일
APK 안에있던 JNI 파일추출. IDA 를이용하면, 함수이름보여짐. 함수명 : Java_com_app_crackme_MainActivity_CreateSerial
Clear!
ARM Based Android Device 에서 Test 환경구성 ARM Assembly 로보는 C 언어함수호출규약파악 자주사용되는 C 언어문법형태파악. Webkit One-day 취약점분석
Test Device/OS : Samsung Galaxy S3 / Android Host OS : Ubuntu 12.04 Cross Compiler : Android-NDK-r8d Android Debugger : Android-SDK
NDK : http://developer.android.com/tools/sdk/ndk/index.html NDK 안의 arm-android toolchain 설치
설치된 Toolchain 을이용한 ARM 예제컴파일방법
설치된 Toolchain 을이용한 Thumb 예제컴파일방법
ARM Mode 결과 Thumb Mode 결과
컴파일된바이너리를 adb 를이용해 test device 에업로드후실행.
인자가 4 개인경우 인자가 4 개이상인경우 Register R0 R1 R2 R3 R7 용도 1 번째인자 / 함수반환값 2 번째인자 3 번째인자 4 번째인자 Syscall 번호 4 개이상의인자를사용하면, 스택을사용함.
If-else 구문
Switch 구문
Target Third Party Application 목적 : Android App 에대한동적디버깅예제. 사용 Tool : gdb, gdbserver
Target Application 목적 : Android App 에대한취약성점검 사용 Tool : gdb, gdbserver, IDA
1. ARM Architecture Reference Manual ARMv7-A and ARMV7-R / arm.com 2. ARM 으로배우는임베디드시스템 / 안효복저 / 한빛미디어