ARM Assembly
http://recipes.egloos.com/5027277
http://armconverter.com/ - 주소 부분이 ``c 0xffffff???``로 나올 때는 직접 수정해주면 된다.
- ARM assembly instruction은 기본적인 명령어에 추가적인 옵션을 덧붙여 사용하는 식으로 구성되어 있다.
- RISK라서 모든 instruction의 크기가 같다. 단, ARM mode와 Thumb mode로 나뉜다.
- 연산 방향은 ←
- arg/return value pass에 레지스터 `` r0-r3``와 stack을 사용한다.
- i386/amd64와 달리 ARM에서는 `` pc``에 접근해 인자로 사용할 수 있을 뿐만 아니라 수정할 수도 있다. 그러나 여기서도 `` push {pc}``는 안된다.
```c
int f(int i){
putchar('a');
putchar('\n');
return i;
}
int main(){
printf("%p\n", f);
__asm__ __volatile__(
"mov r0, #1 \n\t" // pass arg
"bl 0x83f5 \n\t" // call 0x83f5
// "bl f \n\t" // 0x83f5 == f
);
printf("return back\n");
return 0;
}
```
shellcode를 만드는 경우, 쉘코드 실행을 마치고 원래 진행하던 부분으로 돌아갈 수 있게 ``c push {lr} ... pop {pc}``를 반드시 적어주어야 한다.
b / bl
bx / blx
- Rm의 비트[0]이 0일 경우 프로세서가 ARM 상태로 변경되거나 ARM 상태를 유지한다.
- Rm의 비트[0]이 1일 경우 프로세서가 Thumb 상태로 변경되거나 Thumb 상태를 유지한다.
ldr(load) / str(store)
NOP
mov r0, r0 ==> 0xe1a00000
mov r1, r1 ==> 0xe1a01001
mov r2, r2 ==> 0xe1a02002
... r3-r9, sl, fp, ip, sp(r13), lr(r14)
mov pc, pc ==> 0xe1a0f00f
[ARM T32 - 16 bit] ( Thumb )
NOP ==> 0xb000
mov r8, r8 ==> 0x46c0
[ARM T32 - 32 bit] ( Thumb )
NOP ==> 0xf3af 8000
[ARM A64 - 64 bit] ( ARMv8-A == AArch 64 )
NOP ==> 0xd503201f
```
'OS > Micro' 카테고리의 다른 글
MIPS celsius to fahrenheit (0) | 2018.05.02 |
---|---|
[ARM OS image] Android / Linaro (0) | 2017.10.15 |
[QEMU] armv7 Emulate (0) | 2017.10.14 |