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

我需要编写函数体fun()以便 printf 将打印15。我不能改变fun()的原型,即不能传递任何东西,也不能修改main()函数中的任何东西

4

4 回答 4

5

警告 - 可怕的黑客入侵:

void fun()
{
    int b;
    int *a = &b;
    while(*a != 5)
    {
        a++;
    }
    *a = 15;
}

这会在堆栈中搜索我们希望修改的变量的值,假设它与本地声明的 int 具有相同的对齐方式。它还假设变量实际上会在堆栈中(它可以被优化掉),并且我们不会找到具有相关数字的任何其他位置。这些自然是危险的假设。如果假设被证明是不正确的,那么很可能会发生不好的事情。对于导致使用此类黑客的任何伤害、肢体丧失或死亡,我概不负责。

或者,更安全一些:

void fun()
{
    printf("1");
}
于 2013-03-22T08:44:04.550 回答
2

你的问题只是被标记了[c]您所要求的不能使用正确的、可移植的 C 来完成,除非a定义fun()不同。

如果这个问题是关于堆栈粉碎攻击的,那么如果没有:

  • 知道这就是问题所在;
  • 了解目标硬件架构和操作系统的全部细节。
于 2013-03-22T08:32:43.507 回答
1

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

#define fun() (a = 15)

int main(void)
{
  int a=5;
  fun();
  printf("%d",a);
  return 0;
}
于 2013-03-22T08:29:35.197 回答
0
#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]);
}
于 2013-03-22T08:44:44.657 回答