【发布时间】:2018-09-19 02:28:27
【问题描述】:
我是 Aarch64 程序集的新手(但我知道一些 x86 程序集的基础知识)。我正在尝试在 Android 操作系统上编写类似“shellcode”的东西。
这个 shellcode 被注入到另一个函数中。它应该使用execve 和/system/bin/sh -c 创建一个文件/data/local/tmp/AAABBBCCC。在我的情况下,我不必关心空字节。
在execve 调用之前,我进行系统调用open_at(使用O_CREAT 和O_EXCL)并在/data/local/tmp/ 中创建另一个文件(我使用adr x1, path 加载文件名的地址)。
...
call to open_at
...
// push terminating 0
mov x1, 0
str x1, [sp, #-16]!
// push arg2
adr x1, arg2
str x1, [sp, #-16]!
// push arg1
adr x1, arg1
str x1, [sp, #-16]!
// push arg0
adr x1, arg0
str x1, [sp, #-16]!
// call execve
adr x0, command
ldr x1, [sp]
mov x2, 0
mov x8, SYS_EXECVE
svc 0
...
.balign 4
command:
.string "/system/bin/sh"
arg0:
.string "/system/bin/sh"
arg1:
.string "-c"
arg2:
.string "/system/bin/touch /data/local/tmp/AAABBCCC"
我知道对于 x86,您需要使用 CALL 指令的技巧来获取第一个字符串的地址,以便在堆栈上创建参数数组,因为如果您像我在这里一样使用标签,则标签包含在指令操作码中,并且在注入后它们无效。但这应该是一个不同的情况,对吧?指令 ADR 应该是 pc 相关的,在它的操作码中我看不到任何地址,只是相对距离。
当我将代码注入函数时,对open_at 的调用总是成功并创建文件。但是,应该由execve 创建的文件永远不会创建。
在 Aarch64 上为 execve 在堆栈上创建参数数组的正确方法是什么?堆栈必须是 16 对齐的,所以我尝试总是一次推送两个参数(使用 STP),但这也不起作用。
注入代码是使用aarch64-linux-android工具链制作的,如下所示:
as -o code.o code.asm
objcopy -O binary code.bin code.o
xxd -i code.bin
感谢您的回答!
【问题讨论】:
-
您是否尝试过使用
strace来了解您的代码执行的系统调用?
标签: assembly stack arm64 shellcode execve