1. 有16个可见的32bit寄存器:
r0-r7(所有处理器模式都有各自的寄存器)
r8-r12(通用目的寄存器)
其中: r10 --- sl (stack limit)寄存器
r11 --- fp (frame point) 寄存器
r12 --- ip (供链接器使用)
r13(sp), r14(lr), r15(pc/psr)
2. ARM的栈向下增长, 并且sp指向最后一个数据项(满栈递减).
3. ARM指令固定32位宽度, 其中: 31-28 bit ------------- 条件执行.
指令可分为四类:
--- 跳转指令 b/bl 跳转到小于24位符号偏移
--- 加载/存储指令
--- 数据处理指令
--- 异常产生指令
数据处理指令格式: <opcode mnemonic> <destination> <operand 1> <operand 2>
操作符(opcode) : add, sub, and, eor, orr, mov ...
目标(destination)是寄存器.
操作数1也必须是寄存器(r0-r15)
操作数2可以是寄存器, 被移位的寄存器或者立即数
数据处理是可带6中移位指令:
lsl - 逻辑左移
asl - 算数左移
lsr - 逻辑右移
asr - 算术右移
ror - 循环右移
rrx - with carry bit 循环右移
从内存加载到寄存器:
ldr rX, <address> 例子: ldr r0, [r1] 加载r1指定地址的32位数据到r0寄存器.
ldrb rX, <address>
寄存器存储到内存:
strb rX, <address>
str rx, <address>
多寄存器存储/加载:
stm <stack type> <base register><!>, {register list}
ldm <stack type> <base register><!>, {register list}
栈类型<stack type> : 可分为四种, 满增/满减/空增/空减 ("满"意思是SP指向的地址已经存储着有效数据的)
<base register> : 可以是任何寄存器, 一般为sp
! : 执行指令完成后是否修改base register寄存器的值
异常指令:
swi <number> : 系统调用使用, arm中linux系统调用的基址是 0x900000.
例如: exit 的系统调用: swi 0x900001
系统调用号在内核的/usr/include/asm/unistd.h文件中指出
系统调用的返回值存储在r0当中, 一下是常用的系统调用列表:
execve: r0 = const char *filename, r1 = char *const argv[], r2 = char *const envp[]
swi 0x90000b
setuid : r0 = uid
swi 0x900017
dup2 : r0 = oldfd, r1 = newfd
swi 0x90003f
socket : r0 = 1(SYS_SOCKET), r1 = ptr to int domain, int type, int protocol
swi 0x900066
bind : r0 = 2(SYS_BIND), r1 = ptr to int sockfd, struct sockaddr *my_addr, socklen_t addrlen
swi 0x900066
listen : r0 = 4(SYS_LISTEN), r1 = ptr to int s, int backlog
swi 0x900066
accept : r0 = 5(SYS_ACCEPT), r1 = ptr int s, struct sockaddr *addr, socklen_t *addrlen
swi 0x900066
当使用 svc 0 指令时, r7存放系统的中断号的偏移(例如: exit 是 0x01 而不是 0x900001).
编译thumb指令集时,需要添加 " -mthumb" 选项, 例如: as -mthumb -o test.o test.s
从arm指令切换到thumb指令的汇编代码如下:
.code 32 ### 32位指令集
add r6, pc, #1
bx r6 ###跳转到下个指令,并切换到thumb指令集执行(PC最低位为1)
.code 16 ### 16位指令集
mov r2, #16
参考:
1.Alphanumeric RISC ARM Shellcode : http://www.phrack.org/issues.html?issue=66&id=12
2. Procedure Call Standard for the ARM Architecture : http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
3. Exploit Tutorials : http://www.exploit-db.com/papers/15652/
4. shell-storm.org : http://www.shell-storm.org/search/index.php?shellcode=arm
The ARM Instruction Set (http://www.shell-storm.org/papers/files/664.pdf)
ARM Addressing Modes Quick Reference Card (http://www.shell-storm.org/papers/files/663.pdf)