2013-05-18 3 views
11

Ссылка http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html выделяет способ записи shell-кода execve.Шеллкод в программе C

#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(); 
} 

Что делает линия int (*ret)() = (int(*)())code;?

+2

[Cdecl] (http://cdecl.org /) говорит: введите код в указатель на функцию, возвращающую int –

+0

Я не понимаю() после * ret и int (*)() перед кодом. – Karan

+1

Чтобы разобрать такие конструкции в голове, пройдите по правилу по часовой стрелке/спирали: http://c-faq.com/decl/spiral.anderson.html – jwaliszko

ответ

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

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
       3 
  1. Он определяет ret как указатель на функцию, которая имеет не параметр () и возвращает int. Итак, те () указывают на определение параметров функции.

  2. Это для литья code указателю на функцию, которая не имеет параметра () и возвращает int.

  3. Вводит code в качестве функции и назначает ее ret. После этого вы можете позвонить ret();.

 

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

Это представляет собой последовательность машинных команд, представленных шестнадцатеричных значений. Он будет введен в код как функция.

+1

+1 Хорошее объяснение, и хороший вопрос тоже –

+0

Итак, когда вызывается ret(), как код действительно «запускается», так как я вижу, не видел C-вызов, который «загружает» шеллкод и запускает его? – Karan

+0

@ user85030, да, «load» вызывается в 'ret()', google для «указателя на функцию» –

0

int int объявляет функцию ret(), указывая на массив []; другими словами, функция отображается на двоичные команды кода [].

Конструкция \ x представляет собой безопасный способ вставки шестнадцатеричных символов в строку. Вы могли бы, например, заменить «\ X31» на «1» в качестве кода символа «1» 49, или шестнадцатеричное 31.

+0

Я не понимаю() после * ret и int (*)() перед кодом. – Karan

+0

'ret' - это указатель на функцию (https://en.wikipedia.org/wiki/Function_pointer) на функцию с неопределенным числом аргументов ('() '), которая возвращает' int'.'(int (*)())' Выполняет функцию-код 'code', чтобы сделать согласно адресу funtion-указателя, который принимает неопределенное количество аргументов, вот как объявляется' ret'. – Jack

+0

Может ли эта часть указателя функции быть переписана в более простой форме? – Karan

0

Может ли эта часть указателя функции быть переписана в более простой форме?

Я не знаю, если вы думаете, что это проще, но, может быть:

#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)(); 
Смежные вопросы