※ 引述《gamed (Maiko)》之铭言:
: 我朋友最近去面试
: 其中有一个主管考一题
: char *fun()
: {
: char str[] = {"Hello"};
: return str;
: }
: void main()
: {
: char *p = NULL;
: p = fun();
: printf("%s\n", p);
: }
: 问结果如何
: 主管给的回答是这样可以把指标传出来
指标传出来我想是没问题的,这样就单纯把指到这空间的地址回传出来而已,除非编
译器很好心帮你加工过
: 所以可以印出结果
是可以印出东西,但东西是不是对的比较重要XDD
: 我的观念是 function 的变量只要离开循环
: 都会被归还OS(除了malloc)
: 我的想法对吗?
OS应该是程式结束后才会接手吧?离开function,东西还是会留在那,但下一个用到
该空间的function如果有对该空间写值就会被盖过去,你一点办法都没有,换句话说
无法保证资料的正确性
: 我在公司电脑(ubuntu)
: 的确可以印出字串 囧
那就只是刚好没有function对该空间写值
: 但家里的电脑(ubuntu)却印出乱码
info leak !
: 我有印出指标位址
: 的确可以把位址传出来
我自己用gcc 5.4测试,看起来编译器会在fun()结尾的时候把rax归0,不让指向区域
变量的指标回传
: 我后来想想
: 在公司电脑可以顺利印出字串
: 是运气好 刚好那段位址的内容没被覆蓋??
: 如果想法有错误
: 请各位前辈能多给指导
: 谢谢
就是运气好别怀疑,后续的printf里面用的变量也是用stack上的空间存放,没被盖掉
真的就是运气好
这种写法很糟,很容易有安全性问题,就像你在家试的时候印出的乱码很可能就是泄
漏出敏感地址,让系统保护形同虚设
大概是这样子吧,不知道有没有说错QQ