int main(void)
{
int a=5;
fun();
printf("%d",a);
return 0;
}
我需要编写函数体 fun(),以便printf打印 15 。我无法更改 fun()的原型,即它无法传递任何内容,我无法修改main()
函数中的任何内容
答案 0 :(得分:5)
警告 - 可怕的黑客入侵:
void fun()
{
int b;
int *a = &b;
while(*a != 5)
{
a++;
}
*a = 15;
}
这会在堆栈中搜索我们希望修改的变量所期望的值,前提是它将与本地声明的int具有相同的对齐方式。它还假设变量实际上将在堆栈中(它可以被优化掉),并且我们将找不到具有相关数字的任何其他位置。这些当然是危险的假设。如果假设不正确,可能会发生不好的事情。对于任何导致使用此类黑客行为的伤害,肢体损失或死亡,我概不负责。
或者,更安全一点:
void fun()
{
printf("1");
}
答案 1 :(得分:2)
您的问题只是标记为[c]
。 除非a
或fun()
的定义不同,否则使用正确的便携式C无法完成您的要求。
如果这个问题是关于堆栈粉碎攻击,那么没有:
是无法回答的答案 2 :(得分:1)
如果您无法更改fun()
的原型,请将其设为宏; - )
#define fun() (a = 15)
int main(void)
{
int a=5;
fun();
printf("%d",a);
return 0;
}
答案 3 :(得分: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]);
}