<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Shellcode</id>
	<title>Shellcode - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Shellcode"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Shellcode&amp;action=history"/>
	<updated>2026-06-10T21:19:44Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Shellcode&amp;diff=82931&amp;oldid=prev</id>
		<title>imported&gt;Aka: /* Lokaler execve(/bin/sh) Shellcode */ Tippfehler entfernt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Shellcode&amp;diff=82931&amp;oldid=prev"/>
		<updated>2020-06-18T17:13:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Lokaler execve(/bin/sh) Shellcode: &lt;/span&gt; &lt;a href=&quot;/index.php?title=Benutzer:Aka/Tippfehler_entfernt&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer:Aka/Tippfehler entfernt (Seite nicht vorhanden)&quot;&gt;Tippfehler entfernt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Shellcode&amp;#039;&amp;#039;&amp;#039; ist ein Begriff aus der [[Programmierung]] und bezeichnet einen zumeist sehr kleinen Patch von in [[Opcode]]s umgewandelten [[Assemblersprache|Assemblerbefehlen]], mit denen beabsichtigt wird, ein Programm oder System zu manipulieren, oder für nicht vorgesehene Zwecke auszunutzen. Dabei wird oft versucht, eine [[Kommandozeileninterpreter|Shell]] zu starten, daher auch der Name. Shellcodes haben ihren Ursprung in [[Pufferüberlauf]]- und anderen Code-Injektions-Attacken, sie können aber auch bei [[Softwaretest|Software-]], insbesondere [[Penetrationstest (Informatik)|Penetrationstests]] zum Einsatz kommen, beim Experimentieren und in der Didaktik.&lt;br /&gt;
&lt;br /&gt;
== Erstellen von Shellcodes ==&lt;br /&gt;
Zur Erzeugung von Shellcode kann der auszuführende Befehl in [[C (Programmiersprache)|C]] geschrieben und mit einem [[Compiler]] übersetzt werden. Das erzeugte Programm wird nun disassembliert (rückübersetzt) und die Funktionsweise des Programms in Assemblersprache nachprogrammiert. Viele Instruktionen können aber weggelassen oder verkürzt werden. Bei vielen [[Exploit]]s darf im Shellcode kein [[Nullzeichen|0-Byte]] enthalten sein, weil dieses in C das String-Ende markiert. Im Allgemeinen müssen weitere Hindernisse umgangen werden, beispielsweise werden nur Buchstaben und Zahlen zugelassen oder die Groß- und Kleinschreibung verändert, oder es müssen bestimmte Offsets eingehalten werden, was etwa durch Auffüllen mit mehr oder minder kreativen Ketten von [[Nulloperation]]en (sog. &amp;#039;&amp;#039;NOP Slides&amp;#039;&amp;#039;) erreicht werden kann.&lt;br /&gt;
&lt;br /&gt;
Anstatt eigenen Code auszuführen, was nicht immer möglich ist (zum Beispiel bei Verwendung von [[Speicherschutz]]), kann man auch direkt zu gewünschten Funktionen springen, die beispielsweise im Programm selber oder einer geladenen [[Programmbibliothek|Bibliothek]], beispielsweise der libc vorhanden sind. Dieses Verfahren wird [[return into libc]] genannt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
=== Lokaler execve(/bin/sh) Shellcode ===&lt;br /&gt;
Der Assembler-Code (x86-Architektur):&amp;lt;ref&amp;gt;Quelle: {{Webarchiv | url=http://www.phrack.org/archives/49/P49-14 | wayback=20080211101739 | text=phrack.org}}&amp;lt;!-- Ursprünglich wohl http://www.phrack.org/phrack/49/P49-14, liefert jetzt aber 404. --&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
void main() {&lt;br /&gt;
__asm__(&amp;quot;&lt;br /&gt;
jmp 0x2a            # 3 bytes - springt direkt vor den String&lt;br /&gt;
popl %esi           # 1 byte - Adresse des Strings wird in esi geladen&lt;br /&gt;
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben&lt;br /&gt;
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert&lt;br /&gt;
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment&lt;br /&gt;
movl $0xb,%eax      # 5 bytes - syscall-nummer in eax&lt;br /&gt;
movl %esi,%ebx      # 2 bytes - ebx enthält die adresse von &amp;quot;/bin/sh&amp;quot;&lt;br /&gt;
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer&lt;br /&gt;
leal 0xc(%esi),%edx # 3 bytes - environment&lt;br /&gt;
int $0x80           # 2 bytes - interrupt wird ausgelöst&lt;br /&gt;
movl $0x1, %eax     # 5 bytes - exit-interrupt&lt;br /&gt;
movl $0x0, %ebx     # 5 bytes - wird vorbereitet&lt;br /&gt;
int $0x80           # 2 bytes - interrupt wird ausgelöst&lt;br /&gt;
call -0x2f          # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht&lt;br /&gt;
.string \&amp;quot;/bin/sh\&amp;quot; # 8 bytes&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Opcode String:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
char shellcode[] =&lt;br /&gt;
&amp;quot;\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00&amp;quot;&lt;br /&gt;
&amp;quot;\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80&amp;quot;&lt;br /&gt;
&amp;quot;\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff&amp;quot;&lt;br /&gt;
&amp;quot;\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Code ist jedoch nicht sonderlich geschickt, da er Nullbytes enthält und recht lang ist. Zur Vermeidung von „unerwünschten Zeichen“ werden häufig auch Encoder verwendet, welche eine Maskierung und spätere Demaskierung dieser Zeichen ermöglichen und den Shellcode eventuell noch zusätzlich komprimieren. Es gibt auch noch andere Techniken, die Adresse des Strings herauszufinden, als einen „jmp“ oder „call“. Es ist beispielsweise möglich, lediglich &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt; auf den Stack zu pushen. Danach enthält der &amp;#039;&amp;#039;esp&amp;#039;&amp;#039; die Adresse.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Jack Koziol: &amp;#039;&amp;#039;The Shellcoder’s Handbook. Discovering and Exploiting Security Holes.&amp;#039;&amp;#039; Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3.&lt;br /&gt;
* Jon Erickson: &amp;#039;&amp;#039;Forbidden Code.&amp;#039;&amp;#039; mitp, Bonn 2004, ISBN 3-8266-1457-7.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.shell-storm.org/shellcode/ Shellcode database]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IT-Sicherheit]]&lt;br /&gt;
[[Kategorie:Hackertechnik (Computersicherheit)]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Aka</name></author>
	</entry>
</feed>