Search

ARM Exploit

Category
임베디드
Column
2022/01/07 12:51
Tags
study

1. ARM assembly

알아야 할 ARM 어셈 기초 지식
Calling Convention
함수 인자 전달 및 호출
지역 스택 확보
스택 push, pop 방법
base pointer
return adress 전달/복귀
shellcode 분석

1) 레지스터

64bit mode → 32bit mode 전환 가능
범용 레지스터 (16개)
r0 ~ r3 : 서브 루틴의 인자 혹은 결과 값 저장
그 이상의 인자는 스택에 저장
r11 : base pointer를 가르킴
r13 : sp
r14 : lr (link register)
lr : 함수 호출 시 되돌아갈 함수의 주소가 저장되는 레지스터
r15 : pc
상태 레지스터 → mode 전환 시 이용
fps, cpsr

2) 예제1

1.
lr, r11 순서로 stack에 저장
2.
r11 = sp+4
3.
sp = sp -8 // 아마 스택 프레임 확보인듯
4.
pop {r11, pc} // bp 복구하고, lr에 있는 주소를 pc로 넣고 jmp

3) 예제2

프롤로그에서 예제1과는 다르게 왜 lr 레지스터를 저장 안할까?
자세히 보면 sub func이 호출되지 않음. 따라서 bp를 움직일 필요가 없음

2. 중요 명령어

arm 모드 // 32bit
thumb 모드 // 32bit에서 돌아가는 16bit 기계어
⇒ 최적화 루틴에 의해서 컴파일러가 모드를 변경함
bx → jmp 동시에 모드 변경 가능
bx or blx를 이용해서 jmp할 때 오퍼랜드로 레지스터가 들어감. 그 레지스터에는 jmp할 주소가 들어감. 그 주소는 4바이트로 정렬되어있음. 따라서 하위 한 비트는 안쓰임. 이 bit를 이용해서 mode 체크를 진행함.

3. ARM 기반 BOF 공격 방식

4. 참고자료