Указатель функции и предупреждение GCC - PullRequest
2 голосов
/ 12 августа 2010

В настоящее время я изучаю, как написать шелл-код и получить предупреждение GCC "назначение несовместимого типа указателя". Почему?

Привет, LM


char shellcode[] = 
  "\x31\xc0"
  "\xb0\x01"
  "\x31\xdb"
  "\xcd\x80";


int main() {
  void (*func)() = shellcode;

  func();

  return 0;
}

Ответы [ 4 ]

4 голосов
/ 12 августа 2010

Я напишу свое предложение в качестве ответа и шлюху для некоторой репутации: -)

Вам необходимо явно привести указатель данных в указатель на функцию.Используя typedef для соответствующего указателя на функцию, вы можете сделать это, не делая код слишком трудным для чтения:

char shellcode[] = 
    "\x31\xc0"
    "\xb0\x01"
    "\x31\xdb"
    "\xcd\x80";

typedef void (*SHELLCODE)(void);

int main() {
    SHELLCODE func = (SHELLCODE) shellcode;
    func();

    /* ...and this will work as well, which some might find more readable: */
    ((SHELLCODE) shellcode)();

    return 0;
}

Это скомпилируется чисто с помощью clang 1.1, но GCC 4.4.3 все равно выдаст вам предупреждение опреобразование указателя - хотя теперь это более точное предупреждение:

$ gcc -Wall -Wextra -ansi -pedantic shellcode.c 
shellcode.c: In function ‘main’:
shellcode.c:10: warning: ISO C forbids conversion of object pointer to function pointer type
shellcode.c:14: warning: ISO C forbids conversion of object pointer to function pointer type

Если пропустить флаг "-pedantic", он будет скомпилирован аккуратно и с GCC, но кто когда-нибудь серьезно относится к этому?

2 голосов
/ 12 августа 2010

Спасибо, я думаю, что нашел решение, но я не знаю, можно ли его написать лучше:

<code>long (*func)() = (long (*)())shellcode;

Нет предупреждений с этим кодом

1 голос
/ 12 августа 2010

Нет неявного преобразования указателей объектов в указатели функций. Вам понадобится явное приведение (void(*)()) (и даже это не гарантированно будет работать или компилироваться).

0 голосов
/ 12 августа 2010

Потому что char[] несовместимо с void(*)() !! Что на земле это вообще значит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...