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 체크를 진행함.