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


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

5.2 Разработка шеллкода
Разработка шеллкода может начаться с компиляции простой программы,
написанной на языке C, которая выполняет нужную нам операцию. Самый
классический шеллкод запускает оболочку, вызывая команду execve():
Алгоритм 4 Классический шеллкод (shell.c)
#include
void operation(){
execve(”/bin/sh”, NULL, NULL);
}
int main(int argc, char ∗∗ argv){
operation();
}
Теперь мы должны получить ассемблерный код программы, убедившись, что
сгенерировали позиционно-независимый код, поскольку мы не знаем, где будет
размещен шеллкод в памяти.
44


root@armstation# gcc -S -static shell.c
root@armstation# gcc -static shell.c -o shell
root@armstation#
Мы сгенерировали как машинный код, так и ассемблерный код программы. Мы
включили сюда листинг shell.s (алгоритм 5), но для анализа машинного кода мы
будем использовать gdb.
root@armstation# gdb ./shell
...
(gdb) disass operation
Dump of assembler code for function operation:
0x00008238 : mov r12, sp
0x0000823c : push {r11, r12, lr, pc}
0x00008240 : sub r11, r12, #4 ; 0x4
0x00008244 : ldr r0, [pc, #20] ; 0x8260
0x00008248 : mov r1, #0 ; 0x0
0x0000824c : mov r2, #0 ; 0x0
0x00008250 : bl 0x119b0
0x00008254 : sub sp, r11, #12 ; 0xc
0x00008258 : ldm sp, {r11, sp, lr}
0x0000825c : bx lr
0x00008260 : andeq r4, r6, r12, lsr #3
End of assembler dump.
(gdb)
Так происходит сборка функции. Критический момент, который нас интересует,
и который мы превратим в шеллкод, это вызов execve (строки 0x00008244-
0x00008250). Первые три строки подготавливают регистры r0-r2 для
размещения в них аргументы, а последняя строка выполняет вызов.
Для создания шеллкода нам нужно извлечь байты машинного кода и
закодировать их в строку текста. Очень полезным инструментом для этого
является hexdump, который может печатать шестнадцатеричные дампы
двоичных файлов, и поддерживает использование смещений, чтобы извлечения
точных секций данных.
Чтобы найти местоположение интересующего нас кода в файле, мы должны
использовать небольшой трюк:
gdb address — loading offset(0x8000) = file offset
Вычитая из адреса, по которому gdb выдает нам смещение, по которому
загружается код программы (0x8000), мы находим смещение, по которому код
находится в файле (0x8000), мы находим смещение, по которому код находится
в файле.
45



Download 0.92 Mb.

Do'stlaringiz bilan baham:
1   ...   19   20   21   22   23   24   25   26   ...   36




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