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)