簡體   English   中英

功能指針和GCC警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM