【问题标题】:ARM64 assembly - execve arguments on stackARM64 程序集 - 堆栈上的 execve 参数
【发布时间】:2018-09-19 02:28:27
【问题描述】:

我是 Aarch64 程序集的新手(但我知道一些 x86 程序集的基础知识)。我正在尝试在 Android 操作系统上编写类似“shellcode”的东西。

这个 shellcode 被注入到另一个函数中。它应该使用execve/system/bin/sh -c 创建一个文件/data/local/tmp/AAABBBCCC。在我的情况下,我不必关心空字节。

execve 调用之前,我进行系统调用open_at(使用O_CREATO_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


【解决方案1】:

在我发布这个问题几分钟后,我意识到错误出在哪里。

在堆栈上创建参数数组的正确方法是使用 STP 指令。它一次存储两个寄存器(我之前用错了——我以错误的顺序提供了寄存器)。应该这样做:

mov     x1, 0
adr     x2, arg2
stp     x2, x1, [sp, #-16]!

adr     x1, arg1
adr     x2, arg0
stp     x2, x1, [sp, #-16]!

【讨论】:

  • 或者您可以使用 [sp, #-8]! 一次推送一个值,而不是存储 8 个字节并将 SP 递减 16。但是,stp 显然更好,因为它速度快并且可以节省总计说明。
  • 真的吗?如果您查看此website,“问题”标题下以Broken AArch64 implementation of ... 开头的第一个代码列表表示它不起作用...
  • 谢谢,我不太了解AArch64;感谢您的链接。我不知道始终需要 16 字节堆栈对齐,并且由硬件强制执行! (显然可以通过特权代码禁用:community.arm.com/processors/b/blog/posts/…)这是一个有趣的功能;我想知道他们为什么这样做,而不是像 x86 和其他 ISA 那样让调用约定来要求/保证堆栈对齐。
猜你喜欢
  • 2016-04-18
  • 2014-06-30
  • 2011-01-26
  • 2020-06-13
  • 1970-01-01
  • 2017-10-11
  • 2012-10-19
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多