[英]Function Pointer and GCC warning
我目前正在學習如何編寫shellcode並獲得GCC警告“分配不兼容的指針類型”。 為什么?
LM,問候
char shellcode[] =
"\x31\xc0"
"\xb0\x01"
"\x31\xdb"
"\xcd\x80";
int main() {
void (*func)() = shellcode;
func();
return 0;
}
我會把我的建議寫成答案,並為某些聲譽而who妓:-)
您需要將數據指針顯式轉換為函數指針。 使用用於適當的函數指針的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完全兼容,但是誰會認真對待呢?
謝謝,我想我找到了一個解決方案,但我不知道是否可以寫得更好:
long (*func)() = (long (*)())shellcode;
此代碼無警告
沒有對象指針到函數指針的隱式轉換。 您將需要一個顯式的強制轉換(void(*)())
(甚至不能保證可以正常工作或編譯)。
因為char[]
與void(*)()
不兼容! 這到底意味着什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.