2013-03-11 50 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