我目前正在学习如何编写shellcode并获得GCC警告“指定不兼容的指针类型”。为什么呢?
问候, LM
char shellcode[] =
"\x31\xc0"
"\xb0\x01"
"\x31\xdb"
"\xcd\x80";
int main() {
void (*func)() = shellcode;
func();
return 0;
}
答案 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(*)()
不兼容!!究竟是什么意思呢?