Я узнаю больше о шеллкоде и создании системных вызовов в arm64 на устройствах iOS. Устройство, на котором я тестирую это 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, и вот некоторые фрагменты
//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
и т. Д., Поэтому может быть несколько вариантов. Я пробовал разные методы, но не смог заставить работать два фрагмента кода.
Может ли кто-нибудь дать какое-нибудь руководство?
EDIT:
Это то, что Xcode показывает в своем представлении Assembly, когда я написал syscall функции C 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
Я не уверен, почему этот код был выпущен.