我正在学习如何在iOS设备上使用arm64架构的shellcode并进行系统调用。我正在测试的设备是iPhone 6S。
我从这个链接(https://github.com/radare/radare2/blob/master/libr/include/sflib/darwin-arm-64/ios-syscalls.txt)中获取了系统调用列表。
我从这里了解到x8用于在arm64架构中放置系统调用号码(http://arm.ninja/2016/03/07/decoding-syscalls-in-arm64/)。
我觉得用于传递arm64参数的各种寄存器应该与arm相同,因此我参考了这个链接(https://w3challs.com/syscalls/?arch=arm_strong),该链接来源于https://azeria-labs.com/writing-arm-shellcode/。
我在Xcode中编写了内联汇编代码,以下是一些片段。
然而,当我跨过这些代码时,应用程序并没有终止。
如果此系统调用有效,则应在Xcode的控制台输出屏幕中打印出一些文本。然而,没有任何内容被打印出来。
有许多关于ARM汇编的在线文章,有些使用
有人能提供一些指导吗?
编辑: 当我编写一个C函数syscall
我不确定为什么这段代码被省略了。
我从这个链接(https://github.com/radare/radare2/blob/master/libr/include/sflib/darwin-arm-64/ios-syscalls.txt)中获取了系统调用列表。
我从这里了解到x8用于在arm64架构中放置系统调用号码(http://arm.ninja/2016/03/07/decoding-syscalls-in-arm64/)。
我觉得用于传递arm64参数的各种寄存器应该与arm相同,因此我参考了这个链接(https://w3challs.com/syscalls/?arch=arm_strong),该链接来源于https://azeria-labs.com/writing-arm-shellcode/。
我在Xcode中编写了内联汇编代码,以下是一些片段。
//exit syscall
__asm__ volatile("mov x8, #1");
__asm__ volatile("mov x0, #0");
__asm__ volatile("svc 0x80");
然而,当我跨过这些代码时,应用程序并没有终止。
char write_buffer[]="console_text";
int write_buffer_size = sizeof(write_buffer);
__asm__ volatile("mov x8,#4;" //arm64 uses x8 for syscall number
"mov x0,#1;" //1 for stdout file descriptor
"mov x1,%0;" //the buffer to display
"mov x2,%1;" //buffer size
"svc 0x80;"
:
:"r"(write_buffer),"r"(write_buffer_size)
:"x0","x1","x2","x8"
);
如果此系统调用有效,则应在Xcode的控制台输出屏幕中打印出一些文本。然而,没有任何内容被打印出来。
有许多关于ARM汇编的在线文章,有些使用
svc 0x80
,有些使用svc 0
等,因此可能会有一些变化。我尝试了各种方法,但我无法使这两个代码片段起作用。有人能提供一些指导吗?
编辑: 当我编写一个C函数syscall
int return_value=syscall(1,0);
时,Xcode在其汇编视图中显示的内容如下: mov x1, sp
mov x30, #0
str x30, [x1]
orr w8, wzr, #0x1
stur x0, [x29, #-32] ; 8-byte Folded Spill
mov x0, x8
bl _syscall
我不确定为什么这段代码被省略了。
write_buffer[]
中的存储可能会被优化掉,因为您没有使用“memory”占位符或虚拟内存源输入。寄存器中的指针并不意味着所指向的内存也是asm语句的输入或输出。此外,您可以使用register char *buf asm("x1")
来让编译器选择x1
作为“r”约束条件。这样可以将asm
语句减少到仅包含系统调用指令而没有mov
指令。(但是您必须记得指定一个x0
输出。) - Peter Cordeswrite()
系统调用包装函数来查看它的行为吗? - Peter Cordeswrite()
函数,以查看现有库代码如何进行系统调用。或者,如果您能找到write
包装函数,只需反汇编C库即可。我假设iOS与普通Unix类似,具有包含系统调用包装函数的libc.so
或类似的东西,您可以从C中调用它们。 - Peter Cordes