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)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章