<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A8%D0%B5%D0%BB%D0%BB-%D0%BA%D0%BE%D0%B4</id>
	<title>Шелл-код - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A8%D0%B5%D0%BB%D0%BB-%D0%BA%D0%BE%D0%B4"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A8%D0%B5%D0%BB%D0%BB-%D0%BA%D0%BE%D0%B4&amp;action=history"/>
	<updated>2026-07-16T16:46:18Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A8%D0%B5%D0%BB%D0%BB-%D0%BA%D0%BE%D0%B4&amp;diff=40674&amp;oldid=prev</id>
		<title>imported&gt;DILIN: /* Внутреннее устройство и классическая структура шелл-кода */ исправление</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A8%D0%B5%D0%BB%D0%BB-%D0%BA%D0%BE%D0%B4&amp;diff=40674&amp;oldid=prev"/>
		<updated>2026-01-21T07:41:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Внутреннее устройство и классическая структура шелл-кода: &lt;/span&gt; исправление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Шелл-код&amp;#039;&amp;#039;&amp;#039; ({{lang-en|shellcode}}, код запуска оболочки) — это [[Машинный код|двоичный исполняемый код]], который обычно передаёт управление командному процессору, например &amp;#039;/bin/sh&amp;#039; в [[Unix]] [[Unix shell|shell]], &amp;#039;command.com&amp;#039; в [[MS-DOS]] и &amp;#039;cmd.exe&amp;#039; в [[операционная система|операционных системах]] [[Microsoft Windows]]. Шелл-код может быть использован как полезная нагрузка [[эксплойт]]а, обеспечивающая [[Хакер|взломщику]] доступ к [[Интерфейс командной строки|командной оболочке]] ({{lang-en|shell}}) в [[компьютер]]ной системе.&lt;br /&gt;
&lt;br /&gt;
При эксплуатации удаленной уязвимости шелл-код может открывать заранее заданный порт [[TCP]] уязвимого компьютера, через который будет осуществляться дальнейший доступ к командной оболочке, такой код называется привязывающим к порту ({{lang-en|port binding shellcode}}).&lt;br /&gt;
Если шелл-код осуществляет подключение к порту компьютера атакующего, что производится с целью обхода [[Межсетевой экран|брандмауэра]] или [[NAT]], то такой код называется обратной оболочкой ({{lang-en|reverse shell shellcode}}).&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
Шелл-код обычно внедряется в память эксплуатируемой программы, после чего на него передается управление путём переполнения [[стек (компьютер)|стека]], или при [[Переполнение буфера|переполнении буфера]] в [[Куча (нераспределённая память)|куче]], или используя [[Атака форматной строки|атаки форматной строки]]. Передача управления шелл-коду осуществляется перезаписью адреса возврата в стеке адресом внедрённого шелл-кода, перезаписью адресов вызываемых функций или изменением обработчиков прерываний. Результатом этого является выполнение шелл-кода, который открывает командную строку для использования взломщиком.&lt;br /&gt;
&lt;br /&gt;
=== Обнаружение ===&lt;br /&gt;
[[Хакер|Взломщики]] пишут шелл-коды, часто используя приёмы, скрывающие их атаку. Они часто пытаются выяснить, как [[Система обнаружения вторжений|системы обнаружения вторжений]] (СОВ) распознают любую входящую атаку. Типичная [[Система обнаружения вторжений|СОВ]] обычно просматривает все входящие пакеты в поисках структуры, специфичной для шелл-кода (часто большой массив [[Мусорные команды|мусорных]] кодов, в простейшем случае [[NOP]]-ов); если она находит такую структуру, пакет уничтожается до того, как он достигнет своей цели. Слабая позиция СОВ в данном случае состоит в том, что она не осуществляет действительно хороший поиск, иначе он займёт слишком много времени и, таким образом, замедлит соединение с интернетом.&lt;br /&gt;
&lt;br /&gt;
Шелл-код почти всегда содержит строку с именем [[оболочка UNIX|оболочки]]. Все входящие пакеты, содержащие такую строку, всегда рассматриваются как подозрительные в глазах СОВ. Также некоторые приложения не принимают неалфавитно-цифровой ввод (они не принимают символов, выходящих за рамки набора a-z, A-Z, 0-9 и нескольких других символов.)&lt;br /&gt;
&lt;br /&gt;
Для прохождения через все эти меры, направленные против вторжения, взломщики используют [[шифрование]], [[самомодифицирующийся код]], [[полиморфный код]] и [[алфавитно-цифровой код]].&lt;br /&gt;
&lt;br /&gt;
== Внутреннее устройство и классическая структура шелл-кода ==&lt;br /&gt;
По своей сути, шелл-код — это минималистичная, самодостаточная машинная программа, написанная на [[ассемблер]]е и часто представленная в виде строки [[байт-код]]а (опкодов). Его цель — выполнить строго определённую задачу (например, запуск оболочки) с использованием минимального объема памяти и без зависимостей.&lt;br /&gt;
&lt;br /&gt;
=== Канонический пример: шелл-код для [[Linux]] x86 (execve(«/bin/sh»)) ===&lt;br /&gt;
Это классический учебный пример. Его задача — выполнить системный вызов &amp;lt;code&amp;gt;execve&amp;lt;/code&amp;gt; с аргументом &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Логика на [[Си (язык программирования)|C]] ====&lt;br /&gt;
 execve(&amp;quot;/bin/sh&amp;quot;, NULL, NULL);&lt;br /&gt;
&lt;br /&gt;
=== Разбор на ассемблере (AT&amp;amp;T syntax) ===&lt;br /&gt;
&lt;br /&gt;
===== Обнуление регистров =====&lt;br /&gt;
Сначала нужно обнулить регистры, которые будут использоваться как аргументы, чтобы избежать нулевых байт.&lt;br /&gt;
 xorl   %eax, %eax       # EAX = 0 (системный вызов execve)&lt;br /&gt;
 xorl   %edx, %edx       # EDX = 0 (envp = NULL)&lt;br /&gt;
&lt;br /&gt;
===== Помещение строки «/bin/sh» в стек =====&lt;br /&gt;
Стек работает как [[LIFO]], поэтому строку кладут задом наперед. Также важно завершить её нулевым байтом.&lt;br /&gt;
 pushl  %edx            # Поместить нулевой байт (конец строки)&lt;br /&gt;
 pushl  $0x68732f2f     # Поместить &amp;quot;hs//&amp;quot; (//sh, второй / для выравнивания)&lt;br /&gt;
 pushl  $0x6e69622f     # Поместить &amp;quot;nib/&amp;quot; (/bin)&lt;br /&gt;
Теперь в стеке лежит строка &amp;lt;code&amp;gt;/bin//sh\0&amp;lt;/code&amp;gt;, а регистр &amp;lt;code&amp;gt;%esp&amp;lt;/code&amp;gt; (указатель стека) указывает на её начало.&lt;br /&gt;
&lt;br /&gt;
===== Подготовка аргументов для execve =====&lt;br /&gt;
 movl   %esp, %ebx      # EBX = указатель на строку &amp;quot;/bin//sh\0&amp;quot; (argv[0])&lt;br /&gt;
 pushl  %edx            # argv[1] = NULL&lt;br /&gt;
 pushl  %ebx            # argv[0] = указатель на строку&lt;br /&gt;
 movl   %esp, %ecx      # ECX = указатель на массив argv[]&lt;br /&gt;
Системный вызов &amp;lt;code&amp;gt;execve&amp;lt;/code&amp;gt; в Linux x86 принимает аргументы: &amp;lt;code&amp;gt;eax&amp;lt;/code&amp;gt; (номер вызова), &amp;lt;code&amp;gt;ebx&amp;lt;/code&amp;gt; (путь к файлу), &amp;lt;code&amp;gt;ecx&amp;lt;/code&amp;gt; (argv), &amp;lt;code&amp;gt;edx&amp;lt;/code&amp;gt; (envp).&lt;br /&gt;
&lt;br /&gt;
===== Выполнение системного вызова =====&lt;br /&gt;
 movb   $0xb, %al       # Номер системного вызова execve = 11 (0xb)&lt;br /&gt;
 int    $0x80           # Прерывание для вызова ядра&lt;br /&gt;
&lt;br /&gt;
=== Итоговый байт-код (hex) ===&lt;br /&gt;
 31 c0 31 d2 52 68 2f 2f 73 68 68 2f 62 69 6e 89 e3 52 53 89 e1 b0 0b cd 80&lt;br /&gt;
Это и есть чистый шелл-код — последовательность инструкций [[процессор]]а. Его можно вставить в буфер C-программы как массив символов и передать на него выполнение.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Переполнение буфера]]&lt;br /&gt;
* [[Переполнение кучи]]&lt;br /&gt;
* [[Информационная безопасность]]&lt;br /&gt;
* [[Язык ассемблера]]&lt;br /&gt;
* [[Heap spraying]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* {{cite web&lt;br /&gt;
 |url           = http://www.vividmachines.com/shellcode/shellcode.html&lt;br /&gt;
 |title         = Shellcoding for Linux and Windows Tutorial with example windows and linux shellcode&lt;br /&gt;
 |author        = Steve Hanna&lt;br /&gt;
 |datepublished = 2004&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |access-date    = 2007-09-30&lt;br /&gt;
 |archive-url    = https://web.archive.org/web/20050728094519/http://www.vividmachines.com/shellcode/shellcode.html&lt;br /&gt;
 |archive-date   = 2005-07-28&lt;br /&gt;
 |url-status      = dead&lt;br /&gt;
}}&lt;br /&gt;
* {{cite web&lt;br /&gt;
 |url         = http://www.enderunix.org/docs/en/sc-en.txt&lt;br /&gt;
 |title       = Designing Shellcode Demystified&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20050829191606/http://www.enderunix.org/docs/en/sc-en.txt&lt;br /&gt;
 |archive-date = 2005-08-29&lt;br /&gt;
 |access-date  = 2005-07-28&lt;br /&gt;
 |url-status    = dead&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Атаки и эксплойты]]&lt;/div&gt;</summary>
		<author><name>imported&gt;DILIN</name></author>
	</entry>
</feed>