该方法仅代表个人使用方法,要是有更好的方法,我倒是想试试你的。

Why :

想要在elf文件注入shellcode完成外部函数的调用。

外部符号调用,elf有两种处理方式,1. 调用dlopen ,dlopen 主动调用。 2. 在生成elf文件时,引入外部符号。

那么shellcode调用外部符号也可以走这两种方式。

第一种方案,相对简单点,绝大多数的so文件都会导入dlopen和dlsym符号,就只需要自己实现调用了。

How:

利用ndk里面的编译工具as ,将写好的asm 转化为elf,这样的elf文件结构简单,灵活,包含了代码和需要的字符串。

.data 
string: .asciz "American\n"

.text 
.global _start

_start: 
	add  r12 , pc ,#0x8 @ 获取字符串
	mov r0 , r12 
	blx dlsym
endoftext:

as main.S -o main

同样可以用android studio 配合Cmakelist来编译asm文件更加方便编写和调试。

创建文件

cmake 允许编译asm

添加编译文件

shell遵循的原则将代码和数据区别开。

经过两天的优化,得到的shellcode模板,修后仅需修改数据部分即可。


.text
.global func
.hidden func
.type func , #function
.align 4
.fnstart
func:
    push {r0 , r1,  r2 , r3 , r4,r12 , lr} @ r0 参数0 , r1 参数1 ,r2 运算基地址,r3 got表地址 ,r12 目标函数地址,
    mov r0 , #0xffffffff 
	add  r12 , pc , #0x28
	mov r1 , r12	
	add r12 , pc , #0 
	ldr r3 , fileoffset  @减去注入地址偏移
	sub r12 , r3 
	sub r12 , #0x18 @ 减去ip偏移,获得基址
	ldr r3 , gotoffset
	add r12 , r3 @ 0xff 替换为got表偏移
    ldr r4 , [r12]
	blx r4
	blx r0
	pop {r0 , r1, r2 , r3 , r4,r12 , pc}
endoffunc:
    string: .asciz "jjno1"
    gotoffset: .int 0x86c2ae4 
    fileoffset: .int 0x318
.fnend
.size func  , . - func

分类: llvm二进制

pareto

未来什么方向不管,先做自己喜欢做的事情。

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注