前一篇中介绍了arm shellcode基本用法,现在涉及到arm和thumb状态
在前一篇中默认为arm32模式:
text:00008074 ; Segment type: Pure code
.text:00008074 AREA .text, CODE
.text:00008074 ; ORG 0x8074
.text:00008074 CODE32
.text:00008074
.text:00008074 EXPORT _start
.text:00008074 _start
.text:00008074 MOV R2, #0x10
.text:00008078 ADR R1, ascii ; "hello shell\n"
.text:0000807C MOV R0, #1
.text:00008080 MOV R7, #4
.text:00008084 SVC 0
.text:00008088 SUB R0, R0, R0
.text:0000808C MOV R7, #1
.text:00008090 SVC 0
.text:00008090 ; ---------------------------------------------------------------------------
.text:00008094 ascii DCB "hello shell",0xA,0 ; DATA XREF: .text:00008078o
.text:000080A1 DCB 0, 0, 0
.text:000080A1 ; .text ends
若要转化为thumb状态则需要先得到thumb状态的地址存放到r6,然后通过bx r6命令来转换:
.section .text
.global _start
_start:
.code 32
#thumb-Mode on
add r6, pc, #1
bx r6
.code 16
mov r2, #16
adr r1, ascii
mov r0, $0x1
mov r7, $0x4
svc 0
// _exit
sub r0, r0, r0
mov r7, #1
svc 0
ascii:
.string "hello shell\n"
.balign 4
效果如下:
.text:00008074 AREA .text, CODE
.text:00008074 ; ORG 0x8074
.text:00008074 CODE32
.text:00008074
.text:00008074 EXPORT _start
.text:00008074 _start
.text:00008074 ADR R6, (loc_807C+1)
.text:00008078 BX R6 ; loc_807C
.text:0000807C ; ---------------------------------------------------------------------------
.text:0000807C CODE16
.text:0000807C
.text:0000807C loc_807C ; CODE XREF: .text:00008078j
.text:0000807C ; DATA XREF: .text:_starto
.text:0000807C MOVS R2, #0x10
.text:0000807E ADR R1, ascii ; "hello shell\n"
.text:00008080 MOVS R0, #1
.text:00008082 MOVS R7, #4
.text:00008084 SVC 0
.text:00008086 SUBS R0, R0, R0
.text:00008088 MOVS R7, #1
.text:0000808A SVC 0
.text:0000808A ; ---------------------------------------------------------------------------
.text:0000808C ascii DCB "hello shell",0xA,0 ; DATA XREF: .text:0000807Eo
.text:00008099 DCB 0, 0xC0, 0x46
.text:00008099 ; .text ends
若主函数是thumb状态,而子函数是32位arm的话,需要用到blx指令来做状态转换,可以这样做:
.section .text
.global _start
_start:
.code 32
#thumb-Mode on
add r6, pc, #1
bx r6
.code 16
//blx _write
blx j_write
mov r2, #16
adr r1, ascii2
mov r0, $0x1
mov r7, $0x4
svc 0
// _exit
sub r0, r0, r0
mov r7, #1
svc 0
j_write:
.code 32
b _write
_write:
STMFD SP!, {R0-R7,LR}
mov r2, #16
adr r1, ascii
mov r0, $0x1
mov r7, $0x4
svc 1
LDMFD SP!, {R0-R7,PC}
ascii:
.string "hello shell\n"
.balign 4
ascii2:
.string "shell storm\n"
.balign 4
效果如下:
.text:00008074 AREA .text, CODE
.text:00008074 ; ORG 0x8074
.text:00008074 CODE32
.text:00008074
.text:00008074 ; =============== S U B R O U T I N E =======================================
.text:00008074
.text:00008074
.text:00008074 EXPORT _start
.text:00008074 _start
.text:00008074 01 60 8F E2 ADR R6, (loc_807C+1)
.text:00008078 16 FF 2F E1 BX R6 ; loc_807C
.text:0000807C ; ---------------------------------------------------------------------------
.text:0000807C CODE16
.text:0000807C
.text:0000807C loc_807C ; CODE XREF: _start+4j
.text:0000807C ; DATA XREF: _starto
.text:0000807C 00 F0 08 E8 BLX j_write
.text:00008080 10 22 MOVS R2, #0x10
.text:00008082 0F A1 ADR R1, ascii2 ; "shell storm\n"
.text:00008084 01 20 MOVS R0, #1
.text:00008086 04 27 MOVS R7, #4
.text:00008088 00 DF SVC 0
.text:0000808A 00 1A SUBS R0, R0, R0
.text:0000808C 01 27 MOVS R7, #1
.text:0000808E 00 DF SVC 0
.text:0000808E ; End of function _start
.text:0000808E
.text:00008090 CODE32
.text:00008090
.text:00008090 ; =============== S U B R O U T I N E =======================================
.text:00008090
.text:00008090
.text:00008090 j_write ; CODE XREF: _start:loc_807Cp
.text:00008090 FF FF FF EA B _write
.text:00008094 ; ---------------------------------------------------------------------------
.text:00008094
.text:00008094 _write ; CODE XREF: j_writej
.text:00008094 FF 40 2D E9 STMFD SP!, {R0-R7,LR}
.text:00008098 10 20 A0 E3 MOV R2, #0x10
.text:0000809C 0C 10 8F E2 ADR R1, ascii ; "hello shell\n"
.text:000080A0 01 00 A0 E3 MOV R0, #1
.text:000080A4 04 70 A0 E3 MOV R7, #4
.text:000080A8 01 00 00 EF SVC 1
.text:000080AC FF 80 BD E8 LDMFD SP!, {R0-R7,PC}
.text:000080AC ; End of function j_write
.text:000080AC
.text:000080AC ; ---------------------------------------------------------------------------
.text:000080B0 68 65 6C 6C 6F 20 73 68+ascii DCB "hello shell",0xA,0 ; DATA XREF: j_write+Co
.text:000080BD 00 00 00 DCB 0, 0, 0
.text:000080C0 73 68 65 6C 6C 20 73 74+ascii2 DCB "shell storm",0xA,0 ; DATA XREF: _start+Eo
.text:000080CD 00 00 00 DCB 0, 0, 0
.text:000080CD ; .text ends