更改变量值(C程序)

更改变量值(C程序),c,C,我需要编写fun()函数体,这样printf将打印15。我不能更改fun()的原型,即它不能传递任何内容,我不能修改main()函数中的任何内容 如果无法更改fun()的原型,请将其设置为宏;-) 您的问题已标记为[c]除非a或fun()有不同的定义,否则不能使用正确的可移植C完成您的请求。 如果这个问题是关于堆栈破坏攻击的,那么如果没有以下情况,则无法回答: 知道这就是问题所在 了解目标硬件体系结构和操作系统的全部细节 警告-可怕的黑客入侵: #define fun() (a = 15)

我需要编写fun()函数体,这样printf将打印15。我不能更改fun()的原型,即它不能传递任何内容,我不能修改
main()函数中的任何内容


如果无法更改
fun()
的原型,请将其设置为宏;-)


您的问题已标记为
[c]
除非
a
fun()
有不同的定义,否则不能使用正确的可移植C完成您的请求。

如果这个问题是关于堆栈破坏攻击的,那么如果没有以下情况,则无法回答:

  • 知道这就是问题所在
  • 了解目标硬件体系结构和操作系统的全部细节

警告-可怕的黑客入侵:

#define fun() (a = 15)

int main(void)
{
  int a=5;
  fun();
  printf("%d",a);
  return 0;
}
这将在堆栈中搜索我们希望修改的变量的值,前提是该变量将与本地声明的int具有相同的对齐方式。它还假设该变量实际上将位于堆栈中(可以将其优化掉),并且我们不会在堆栈中找到任何其他具有相关数字的位置。当然,这些都是危险的假设。如果这些假设被证明是错误的,那么坏事就有可能发生。我对使用这种黑客造成的任何伤害、肢体损伤或死亡概不负责

或者,更安全一些:

void fun()
{
    int b;
    int *a = &b;
    while(*a != 5)
    {
        a++;
    }
    *a = 15;
}
#包括
虚无乐趣();
内部主(空)
{
INTA=5;
乐趣();
printf(“%d”,a);
返回0;
}
虚无乐趣(){
int p[1];
p[11]=15;
printf(“%d\n”,p[11]);
}

请告诉我们您对如何做有什么想法。这是一个问题-您在课堂上是否注意了?您正在向函数传递地址。-1您知道Marcos和函数是两件不同的事情。@MM。除了宏不是函数之外,我之前说过将
fun
转换为
macro
是有原因的。如果无法更改fun()的原型,那么。。。删除该功能!我觉得很好。第一个黑客是如何工作的?两个很好的技巧,特别是第一个。搜索
5
value:-)@Aniket它在堆栈中搜索我们希望修改的变量的值,前提是该变量将与本地声明的int具有相同的对齐方式。它还假设该变量实际上将位于堆栈中,并且在堆栈中找不到任何其他具有相关数字的位置。当然,这些都是危险的假设。如果在
a
中找到真正的
5
之前发现了
5
,那么很可能会发生不好的事情。??我不明白。这是在修改stackWell,stack中的a,就像另一个答案一样
void fun()
{
    int b;
    int *a = &b;
    while(*a != 5)
    {
        a++;
    }
    *a = 15;
}
void fun()
{
    printf("1");
}
#include <stdio.h>
void fun();

int main(void)
{
  int a=5;
  fun();
  printf("%d", a); 
  return 0;
}

void fun() {
  int p[1];
  p[11] = 15; 
  printf("%d\n", p[11]);
}