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