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