有关C语言修改内存的一道经典的问题。

Miracle_DuJin 2010-07-21 10:27:06
void main()
{
int a=1;
f();
printf("a=",a);
}

void f()//函数f原型 无返回值,无参数
{
//在这里填写程序,使主函数中的a的输出改变
}
...全文
1669 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovestefanie 2010-08-26
  • 打赏
  • 举报
回复
学习了
LY_loi 2010-07-23
  • 打赏
  • 举报
回复

#include <stdio.h>
void Over(void);
int main(void)
{
int a=-1;
Over();
printf("%d\n",a);
return 0;
}
void Over(void)
{
int **xbp;
/*
xbp是函数调用后执行
[code=Assembly]
pushx %xbp
movx %xsp,%xbp

后的结果,+1就指向栈里的%xbp
*/
xbp=(int **)(&xbp+1);
/*
*xbp指向%xbp入栈的值,该值指向a变量地址后面sizeof(a)个单元,-1就指向了a
*/
*(*xbp-1)=0x0;

}
ant@Ant:~/Ts$ ./ts
0
[/code]
lyboy8 2010-07-22
  • 打赏
  • 举报
回复
来学习一下..........
LY_loi 2010-07-22
  • 打赏
  • 举报
回复
#include    <stdio.h>
void Over(void);
int main(void)
{
int a=1;
Over();
printf("a=%d",a);
return 0;
}
void Over(void)
{
int a;
*((int *)&a+sizeof(void *))=0xFF;
}
LY_loi 2010-07-22
  • 打赏
  • 举报
回复
缓冲区溢出就是这个道理
黄老邪 2010-07-22
  • 打赏
  • 举报
回复
此类问题我感觉基本意义不大!跟平台编译器的关系太大!
就是考察个指针操作犯不上这么考!谁脑残这么写程序???纯粹为了语法而生的东西没有意义!
freefox1 2010-07-22
  • 打赏
  • 举报
回复
来学习一下..........
furtherchan 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 wpj112 的回复:]

不过核心的思路都是用指针找到被压在栈中的'a'的地址,然后修改之,但找到这个地址还是比较麻烦的,可能与栈的增长方向以及编译器在处理局部变量等因素有关。
……
[/Quote]

对,请问该如何确定‘a’的地址???。在线关注中。。。望高人前来解答
furtherchan 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 furtherchan 的回复:]

在linux下试了4楼的代码,发现main中的a没有被改变,输出还是一样
[/Quote]

$ cat main.c
#include <stdio.h>
#include <stdlib.h>
void f()
{
int a[1];
int* ebp = (int*)a[1];
ebp[-3] = 0;
}

int main(int argc, char *argv[])
{
int a=8;
f();
printf("a=%d\n",a);

return 0;
}


$ gcc -o main main.c
$ ./main
a=0

furtherchan 2010-07-22
  • 打赏
  • 举报
回复
在linux下试了4楼的代码,发现main中的a没有被改变,输出还是一样
wpj112 2010-07-22
  • 打赏
  • 举报
回复
int *p1;
void fun();
int _tmain(int argc, _TCHAR* argv[])
{
int a=0x11223344;
fun();
printf("%x\n",a);
return 0;
}


void fun()
{
int data;
p1=&data;
int i;
*(p1+56)=0x44332211;
}

由于前面的解我都试了试,在vs2005上是出错的。所以我自己试了试,得出上了上面的代码在vs2005上是可以运行的,结果是44332211;
不过核心的思路都是用指针找到被压在栈中的'a'的地址,然后修改之,但找到这个地址还是比较麻烦的,可能与栈的增长方向以及编译器在处理局部变量等因素有关。
xuhonghe 2010-07-22
  • 打赏
  • 举报
回复
学习了
baihacker 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 hqin6 的回复:]
引用 36 楼 baihacker 的回复:

给出以前回答的参考资料吧:

是什么修改了this指针[问题点数:20分]
http://topic.csdn.net/u/20091013/10/8d755c2a-75c0-4b49-8dbf-ed767087aecc.html?seed=1299141012&amp;r=60382926#r_60382926

问个另类的问……
[/Quote]

其实都知道没有移植性。
Miracle_DuJin 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 baihacker 的回复:]
给出以前回答的参考资料吧:

是什么修改了this指针[问题点数:20分]
http://topic.csdn.net/u/20091013/10/8d755c2a-75c0-4b49-8dbf-ed767087aecc.html?seed=1299141012&r=60382926#r_60382926

问个另类的问题,如何让下面的程序崩溃?
http://topic.c……
[/Quote]
这都叫你给翻出来了。。辛苦哦~
太乙 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 baihacker 的回复:]

给出以前回答的参考资料吧:

是什么修改了this指针[问题点数:20分]
http://topic.csdn.net/u/20091013/10/8d755c2a-75c0-4b49-8dbf-ed767087aecc.html?seed=1299141012&r=60382926#r_60382926

问个另类的问题,如何让下面的程序崩溃?
http://topic.……
[/Quote]其实,这种修改内存方法,完全没有可移植性,比如,对于32位机和64位机。64位机器的ebp指针就直接放到rbp寄存器中了。。。
baihacker 2010-07-21
  • 打赏
  • 举报
回复
给出以前回答的参考资料吧:

是什么修改了this指针[问题点数:20分]
http://topic.csdn.net/u/20091013/10/8d755c2a-75c0-4b49-8dbf-ed767087aecc.html?seed=1299141012&r=60382926#r_60382926

问个另类的问题,如何让下面的程序崩溃?
http://topic.csdn.net/u/20080409/23/1641a8de-0f7f-4d45-9dd0-75ee383d291f.html

看了使程序崩溃的帖子,改编下,有兴趣进来挑战下。“让主函数的赋值欺骗了你“
http://topic.csdn.net/u/20080410/11/e004895e-cb9a-4d17-b063-f5b215634901.html

一个有趣的问题
http://topic.csdn.net/u/20081031/17/d2c7183f-417b-43c3-b961-716863208abc.html?seed=1172953231

hqin6那么努力地得分,我也不能不能别人面子啊。
skyworth98 2010-07-21
  • 打赏
  • 举报
回复
局部变量存在栈上,去看看函数调用过程相关的资料就明白了

[Quote=引用 32 楼 bobo364 的回复:]
这函数声明一个数组,用数组越界的办法去访问主函数的a的内存地址?好奇怪的办法啊

C/C++ code
#include <stdio.h>

void f();

int main()
{
int a=1;
f();
printf("a=%d",a);
system("pause");
return 0;
}

void f()//函数f原型 无返回值,无参数
……
[/Quote]
skyworth98 2010-07-21
  • 打赏
  • 举报
回复
sp
这个跟编译器有关,有的编译器会留不少padding的,比如security cookie

[Quote=引用 4 楼 baihacker 的回复:]
C/C++ code

//for vc6.0

#include <stdio.h>
#include <stdlib.h>
void main()
{
int a=1;
void f();
f();
printf("a=%d",a);
system("pause");
}

void f()//函数f原型 无返回值,无参数
{
int ……
[/Quote]
bobo364 2010-07-21
  • 打赏
  • 举报
回复
看来这个问题,真的要看汇编代码了
bobo364 2010-07-21
  • 打赏
  • 举报
回复
这函数声明一个数组,用数组越界的办法去访问主函数的a的内存地址?好奇怪的办法啊
#include <stdio.h>

void f();

int main()
{
int a=1;
f();
printf("a=%d",a);
system("pause");
return 0;
}

void f()//函数f原型 无返回值,无参数
{
int a[1];
int* ebp = (int*)a[1];
ebp[-1] = 10;
}
加载更多回复(33)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧