arm 相关学习(1)

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)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值