Есть ли способ написать шеллкод для sendfile, который не использует инструкцию syscall напрямую? - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над ctf-подобным вызовом, и он фильтрует мой шелл-код, чтобы убедиться, что у меня нет шестнадцатеричных кодировок значений команд syscall, sysenter и int 0x0f05 0x0f34 и 0x80cd соответственно.В основном у меня есть шелл-код, который может открыть файл, но он включает инструкцию syscall.Любая помощь с пониманием того, как манипулировать им, чтобы я мог делать системные вызовы без явного помещения последовательности 0x0f05 в мой шелл-код.

lea rdi, _string[rip]
xor rsi, rsi
xor rax, rax
mov al, 2
syscall

Я не обязательно ищу точный ответ, а просто ищу помощь в понимании некоторых возможных способов манипулирования программой для создания системного вызова во время выполнения.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Поскольку вы уже можете вводить код, вы, вероятно, располагаете свой код на странице с разрешением write + exec, чтобы вы могли сделать его самоизменяющимся и сохранять байты для инструкции syscall по одной (поэтому они нене фильтруется как часть imm16).

Или, что еще проще, начните с 0e 05 ... в памяти и используйте inc byte ptr syscall_location[rip], чтобы изменить его на 0f 05 ....Режим относительной RIP-адресации означает, что вам не нужно знать адрес байта, который вы хотите изменить, просто его относительное расстояние (которое ассемблер рассчитает для вас).Возможно, вам придется перейти вперед, чтобы rel32 было отрицательным и не содержало нулевых байтов.Или сначала поместите инструкцию syscall и вернитесь к ней.

Как указывает Синкману, вы можете найти инструкцию syscall где-нибудь на карте памяти процесса, и в этом случае методы, которые вы используете дляret2reg может работать.

Но код совместно используемой библиотеки будет иметь тенденцию быть ASLRed относительно исполняемого файла, и если в основном исполняемом файле нет заглушки PLT для sendfile, динамический компоновщик не сможет найти его.

0 голосов
/ 07 ноября 2018

Да, если используемая вами программа загрузила разделяемые библиотеки, содержащие инструкцию syscall (например, libc), вы можете создать шелл-код, который переместится туда.Или даже перейти прямо к функции-обёртке sendfile в glibc, передавая ей аргументы в регистрах.

Другой способ, вы можете использовать альтернативные системные вызовы, такие как syscalls чтения и сокетов.

...