VC++ 6.0 shellcode

g3t0

Użytkownik
Dołączył
Sierpień 31, 2006
Posty
7
Helo mam takie pytanko, dlaczego kompilacja poniższego kodu zwraca mi błąd:
error C2440:'=':cannot convert from 'char [13]' to 'void(cdecl *)(void)'

Kod:
char shellcode[] = "xe8";

void (*opcode) ();



void main()

{

  opcode=shellcode;

  opcode();

}

W gcc nie miałem z tym problemu.
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Originally posted by g3t0
dlaczego kompilacja poniższego kodu zwraca mi błąd:
error C2440:'=':cannot convert from 'char [13]' to 'void(cdecl *)(void)'

Kod:
char shellcode[] = "xe8";

void (*opcode) ();



void main()

{

  opcode=shellcode;

  opcode();

}
Znam tylko podstawy C++, ale postaram się pomóc. No zobacz, zadeklarowałeś "shellcode" jako typ "char", a teraz odwoływujesz się do niego jak do "void".

Kod:
błąd C2440:'=':nie można przekonwertować z 'char [13]' na 'void(cdecl *)(void)'

Czyli jest to błąd z konwersją, nie wiem jak to zrobić, nie znam aż tak dobrze C++, ale myślę, że już przynajmniej zorientowałeś się o co chodzi z błędem.
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Proponuję się zastanowić: Pod c można tak wskaźniki przypisywać (gcc co najwyżej warn rzuci), pod c++ nie. Co więc trzeba zrobić? Trzeba rzutować.
Kod:
char shellcode[] = "xc3";//dałem ret, żeby sprawdzić

void (*opcode) ();



int main()

{

  opcode=(void(*)())shellcode;

  opcode();

}
 

g3t0

Użytkownik
Dołączył
Sierpień 31, 2006
Posty
7
Dziękuję za pomoc

[ Dodano: 26-09-2006, 14:27 ]
to rzutowanie też wywalało błędy, ale przeszło

Kod:
opcode=(void(*)())&shellcode;
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Jeszcze jedno - jak to ma być c++ to tam powinno być
Kod:
opcode=reinterpret_cast<void(*)()>(shellcode);
Tyle, że każde rzutowanie funkcja<=obiekt jest wg standardu niepoprwne i warn się i tak pokaże.
 
Do góry Bottom