2013-03-11 74 views
6

我是新來的stackoverflow,所以我提前道歉我犯的任何錯誤。從C程序更改堆棧內存

我碰到過這個C拼圖最近。該程序如下。

#include<stdio.h> 

void change() 
{ 

} 

int main() 
{ 
printf("\nHello"); 
change(); 
printf("\nHai"); 
printf("\nHow are you?"); 
return 0; 
} 

預期產量,

Hello 
Hai 
How are you? 

的問題要求我們改變輸出的函數變化()

Hello 
How are you? 

你不應該添加一些代碼如下在main()中做任何改變。

我試圖通過避免語句printf(「\ nHai」)來更改存儲在堆棧內存中的函數change()的返回地址。但是當我使用gcc編譯時,我遇到了錯誤。

我在change()中添加的代碼如下所示。

void change() 
{ 
char ch; 
*(&ch+10)+=20; 
} 

的值添加到CH(10和20)被固定,通過使用

objdump -d ./a.out 

我希望得到一些建議來解決這個問題。提前感謝您的時間和耐心。

+1

你能發佈你得到的錯誤嗎? – nvoigt 2013-03-11 16:33:23

+0

您首先需要進行反彙編,以檢查堆棧中返回值的存儲位置。 – m0skit0 2013-03-11 16:33:57

+11

如果你不得不依賴未定義的行爲來實現結果,我認爲這是一個糟糕的「難題」。除非你專業地進入系統安全,否則這些知識是不值得的。 – DevSolar 2013-03-11 16:34:34

回答

0

以下代碼應達到預期效果。

#include<stdio.h> 
#include <stdlib.h> 

void change() 
{ 
printf("\nHow are you?"); 
exit(0); 
} 

int main() 
{ 
printf("\nHello"); 
change(); 
printf("\nHai"); 
printf("\nHow are you?"); 
return 0; 
} 

此代碼將導致程序打印「你好」,然後執行change()函數,它將打印「你好嗎?」在換行符上,然後退出程序。 exit()函數是c標準庫的一部分,可以看到Here