arm shellcode 编写详析2

前一篇中介绍了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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值