Я новичок в сборке Aarch64 (но знаю некоторые основы сборки x86). Я пытаюсь написать что-то вроде «шеллкода» на ОС Android.
Этот шеллкод внедряется в другую функцию. Предполагается создать файл /data/local/tmp/AAABBBCCC
, используя execve
и /system/bin/sh -c
. В моем случае мне не нужно заботиться о нулевых байтах.
Перед вызовом execve
я делаю системный вызов open_at
(с O_CREAT
и O_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
должна быть относительно ПК, и в ее опкоде я не вижу никаких адресов, только относительные расстояния.
Когда я ввожу код в функцию, вызов open_at
всегда завершается успешно, и файл создается. Однако файл, который должен быть создан execve
, никогда не создается.
Как правильно сделать массив аргументов в стеке для execve
на Aarch64? Стек должен быть выровнен по 16, поэтому я пытался всегда помещать два аргумента за раз (используя STP
), но это тоже не сработало.
Код для инъекций делается с помощью aarch64-linux-android
тулчейна вот так:
as -o code.o code.asm
objcopy -O binary code.bin code.o
xxd -i code.bin
Спасибо за ваши ответы!
strace
, чтобы понять, какие системные вызовы выполняет ваш код? - person fuz   schedule 09.04.2018