该方法仅代表个人使用方法,要是有更好的方法,我倒是想试试你的。
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
0 条评论