功能指针和GCC警告

时间:2010-08-12 11:26:18

标签: c gcc

我目前正在学习如何编写shellcode并获得GCC警告“指定不兼容的指针类型”。为什么呢?

问候, LM


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


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

  func();

  return 0;
}

4 个答案:

答案 0 :(得分:4)

我会把我的建议作为答案和妓女来写一些声誉: - )

您需要将数据指针显式转换为函数指针。使用适当函数指针的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干净地编译,但是谁曾经认真对待过?

答案 1 :(得分:2)

谢谢,我想我找到了一个解决方案,但我不知道我是否可以写得更好:

long (*func)() = (long (*)())shellcode;

此代码没有警告

答案 2 :(得分:1)

对象指针没有隐式转换为函数指针。你需要一个显式的强制转换(void(*)())(甚至不能保证工作或编译)。

答案 3 :(得分:0)

因为char[]void(*)()不兼容!!究竟是什么意思呢?