【发布时间】:2021-04-25 18:05:08
【问题描述】:
最近我一直在尝试探索 iOS 命令 shell 编程。我可以成功编写一个简单的汇编“Hello World”程序,如下所示:
.global _main
.align 2
.text
_main:
mov x0, 1
mov x2, 14
adr x1, hello_txt
mov x16, 4
svc 0
mov x16, 1
svc 0
hello_txt: .ascii "Hello, World!\n"
然后我开始尝试根据系统调用值编写 execve shellcode: https://thog.github.io/syscalls-table-aarch64/latest.html 基于此示例: https://github.com/johnjohnsp1/shellcode-1/blob/master/os/linux/arm64/execve.s
.global _main
.align 2
.text
_main:
// execve("/bin/sh", NULL, NULL);
adr x0, sh // x0 = "/bin/sh"
eor x1, x1, x1 // x1 = NULL
eor x2, x2, x2 // x2 = NULL
mov x16, 221 // x16 = execve
svc 0
sh:
.ascii "/bin/sh\0"
不幸的是,程序没有得到 shell。我尝试了 /bin/ls 等,但它都不起作用。
我后来从一个 C 程序内部调用了 execve,它成功运行 /bin/ls 但没有运行 /bin/bash。似乎 iOS 不允许从系统或 execve 调用 /bin/bash。
我的问题;有什么办法吗?或者我怎样才能进步更多?非常感谢。
更新
感谢 Siguza 的反馈,我可以拥有一个可以工作的 Assembly shellcode(在越狱设备上):
.global _main
.align 2
.text
_main:
// execve("/bin/sh", NULL, NULL);
adr x0, sh // x0 = "/bin/sh"
eor x1, x1, x1 // x1 = NULL
eor x2, x2, x2 // x2 = NULL
mov x16, 59 // x16 = execve
svc 0
sh:
.ascii "/bin/bash\0"
【问题讨论】:
-
execve返回错误,它说什么? iOS,一个 BSD 派生的操作系统,有bash,一个 GNU 项目外壳吗? -
它说:“非法指令:4”。当我用 lldb 调试它时,我看到它没有触发系统调用,而是尝试继续到 sh 标签“shell`sh”的地址并将“/bin/bash”解释为操作码,因此最终失败。当我附加退出操作码时: mov x16, 1 svc 0 它只是退出而没有任何效果。
-
更有可能系统调用确实执行但只是返回而没有成功。如果你检查寄存器,你会看到一个错误代码。
标签: ios assembly arm64 shellcode execve