我正在学习更多关于 shellcode 以及在 iOS 设备上使用 arm64 进行系统调用的知识。我测试的设备是 iPhone 6S。
我从此链接获取了系统调用列表(https://github.com/radare/radare2/blob/master/libr/include/sflib/darwin-arm-64/ios-syscalls.txt 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/ http://arm.ninja/2016/03/07/decoding-syscalls-in-arm64/).
我认为用于传递arm64参数的各种寄存器应该与arm相同,所以我参考了这个链接(https://w3challs.com/syscalls/?arch=arm_strong https://w3challs.com/syscalls/?arch=arm_strong), 取自https://azeria-labs.com/writing-arm-shellcode/ 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 函数系统调用时 Xcode 在其程序集视图中显示的内容int return_value=syscall(1,0);
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
我不确定为什么会发出此代码。