2013-05-18 13 views
11

Der Link http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html markiert eine Möglichkeit, einen Execve-Shellcode zu schreiben.Shellcode im C-Programm

#include<stdio.h> 
#include<string.h> 

unsigned char code[] = 
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"; 

main() 
{ 

    printf("Shellcode Length: %d\n", strlen(code)); 

    int (*ret)() = (int(*)())code; 

    ret(); 
} 

Was macht die Linie int (*ret)() = (int(*)())code;?

+2

[cdecl] (http://cdecl.org /) sagt: Cast-Code in den Zeiger auf die Funktion int int –

+0

Ich verstehe nicht die() nach * ret und int (*)() vor dem Code. – Karan

+1

Um solche Konstruktionen im Kopf analysieren zu können, gehen Sie durch die Regel im Uhrzeigersinn/Spirale: http://c-faq.com/decl/spiral.anderson.html – jwaliszko

Antwort

13
int (*ret)() = (int(*)())code; 
    ~~~~~~~~~~~~ ~~~~~~~~~~~~~~ 
     1    2 

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
       3 
  1. Es definiert ret als Zeiger auf eine Funktion, die keine hat Parameter () und gibt int zurück. Also, diese () zeigt die Definition von Parametern einer Funktion.

  2. Es ist für Casting code zu einem Zeiger auf eine Funktion, die keinen Parameter () hat und int zurückgibt.

  3. Wirkt code als eine Funktion und ordnet es ret zu. Danach können Sie ret(); anrufen.

 

unsigned char code[] = "\x31\xc0\x50\x68\x6e\x2f\... 

Es ist eine Folge von Maschinen durch Hexadezimalwerte dargestellt Anweisungen. Es wird dem Code als Funktion injiziert.

+1

+1 Schöne Erklärung, und gute Frage zu –

+0

Also, wenn ret() aufgerufen wird, wie funktioniert der Code tatsächlich "run", da ich sehe nicht gesehen C Call, dass "lädt" den Shellcode und läuft es? – Karan

+0

@ user85030, ja, "Laden" heißt in ret() ', googeln für" Zeiger auf Funktion " –

0

Die int-Zeile deklariert die Funktion ret(), indem sie auf das Array code [] zeigt; Mit anderen Worten, die Funktion wird den binären Anweisungen von code [] zugeordnet.

Das \ x-Konstrukt ist eine sichere Möglichkeit, hexadezimale Zeichen in eine Zeichenfolge einzubetten. Sie könnte zum Beispiel „\ x31“ von „1“ als der Zeichen-Code von „1“ ersetzt ist, 49 oder hexadezimal 31.

+0

Ich verstehe nicht die() nach * ret und int (*)() vor dem Code. – Karan

+0

'ret' ist ein Funktionszeiger (https://en.wikipedia.org/wiki/Function_pointer) für eine Funktion mit einer nicht definierten Anzahl von Argumenten ('() '), die ein' int' zurückgibt.'(int (*)())' Es wird die 'code'-Funktionsadresse übergeben, die entsprechend der Function-Pointer-Adresse eine undefinierte Anzahl von Argumenten annimmt, so wird 'ret' deklariert. – Jack

+0

Kann dieser Funktionszeiger in einfacherer Form neu geschrieben werden? – Karan

0

Kann dieser Funktionszeiger in einer einfacheren Form neu geschrieben werden?

Ich weiß nicht, ob Sie denken, dies ist einfacher, aber vielleicht:

#include <stdio.h> 
#include <string.h> 

unsigned char code[] = 
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"; 

typedef int(*shellcode_t)(); 

int main(int argc, char ** argv) { 
    printf("Shellcode Length: %ld\n", strlen(code)); 

    shellcode_t ret = (shellcode_t)code; 

    ret(); 
} 
0
(*(void(*)())shellcode)() 

==

p = (void(*)()) shellcode; 
    (*p)();