簡體   English   中英

執行void(char *)函數作為void(void)

[英]Executing void(char*) function as a void(void)

void print( char * str ){ printf("%s",str); }

void some_function(){
    ... Loads a file into `char * buffer` ...
    ... Stores the function print before `buffer` address ...
    ((void(*)(void))buffer();
}

在文件中,有一個“Hello World”,還有一些不可讀的字符。 執行緩沖區將打印“Hello World”。

我知道你可以執行這樣的指針:

void (*foo)(int) = &bar; // such that void bar(int)
(*foo)(123);

但是執行void(int)函數作為void(void)函數及其函數和參數在內存中對我來說是新的。

函數在內存中的外觀是否有標准(如字符串由空字符終止),以便您可以以這種方式執行它?

但是執行void(int)函數作為void(void)函數及其函數和參數在內存中對我來說是新的。

好。 這是未定義的行為,你永遠不應該這樣做。 它可能恰好適用於某些實現,但沒有保證結果。

函數在內存中的外觀是否有標准(如字符串由空字符終止),以便您可以以這種方式執行它?

不,沒有。 更相關的是,沒有關於如何將參數傳遞給函數的標准 - 它取決於實現,並且不要求以不同類型的函數兼容的方式實現它。

但在這種情況下,程序員正在利用內存中函數的知識,並以這樣的方式准備文件,使其在加載到內存並在此特定實現中運行時做正確的事情。 畢竟,這是加載器所做的......他們將文件中的程序讀入內存然后執行它們。 利用程序中的錯誤將惡意代碼加載到程序的內存中並使程序執行它的漏洞利用此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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