免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2073 | 回复: 10
打印 上一主题 下一主题

再求一段代码的解释! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-17 21:54 |只看该作者 |倒序浏览
这是flw2网友曾经贴的例子(引用一下不知道是否可以:))
int main()
{
        int i[1];
        i[-1]=12;
        exit(0); //删除这个看看结果
}

曾经有网友dennie对该代码进行了解释,可惜后来不小心被删了(心痛阿!!!)
原贴在http://bbs.chinaunix.net/viewthr ... &highlight=exit

十分希望有高人能再指点一下,万分谢谢
!!

论坛徽章:
0
2 [报告]
发表于 2006-08-17 22:04 |只看该作者
*((int *)&i + (-1 * sizeof(int))) = 12;

结果是没结果

[ 本帖最后由 mik 于 2006-8-17 22:06 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-08-17 22:29 |只看该作者
原帖由 semomo 于 2006-8-17 21:54 发表
这是flw2网友曾经贴的例子(引用一下不知道是否可以:))
int main()
{
        int i[1];
        i[-1]=12;
        exit(0); //删除这个看看结果
}


数组越界访问,结果未定义。

论坛徽章:
0
4 [报告]
发表于 2006-08-17 22:37 |只看该作者
原帖由 mik 于 2006-8-17 22:04 发表
*((int *)&i + (-1 * sizeof(int))) = 12;

结果是没结果


表达式 i[-1] = 12 应该等价于 *(i - 1) = 12。注意不应该再用 -1 乘以 sizeof(int)。

i 是一个数组,表示第一个元素的地址,所以把这个地址写成 (int *)&i 不可取,直接用 i 表示即可。

论坛徽章:
0
5 [报告]
发表于 2006-08-17 22:42 |只看该作者
数组是从0开始的,哪里有-1啊。

论坛徽章:
0
6 [报告]
发表于 2006-08-17 22:55 |只看该作者
原帖由 whyglinux 于 2006-8-17 22:37 发表


表达式 i[-1] = 12 应该等价于 *(i - 1) = 12。注意不应该再用 -1 乘以 sizeof(int)。

i 是一个数组,表示第一个元素的地址,所以把这个地址写成 (int *)&i 不可取,直接用 i 表示即可。



呵呵~ 犯错误了,没仔细想过。

原意是想:
&i + (-1 * sizeof(int))  这样表达会让LZ清晰一些。

不料 加上 *(...)之后, 结果变成了地址值 i - 16 了。

没细想,误导人了, 还好,有你指出错误

[ 本帖最后由 mik 于 2006-8-17 22:56 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-08-18 00:10 |只看该作者
看这个代码的样子似乎是想讲解一下程序运行时栈中的结构。

我以前写过这样一个程序,LZ可以看一下:

  1. #include <stdio.h>
  2. int funa(void)
  3. {
  4.         printf("AAAAA");
  5.         exit(3);
  6.         return 0;
  7. }
  8. int funb(int (*p)(void))
  9. {
  10.         char *h;
  11.         h = &h;
  12.         /* point to the first variable */
  13.         h += sizeof(char *);
  14.         /* point to the old ebp */
  15.         h += sizeof(char *);
  16.         /* point to the return address */
  17.         (*(int (**)(void))(h)) = p;
  18.         return 0;
  19. }
  20. int main()
  21. {
  22.         funb(funa);
  23.         return 0;
  24. }
复制代码

类似代码在网上也有很多。
我这个代码编译执行后的结果如下:

  1. [monnand@monnand-host lecture]$ gcc overflow.c
  2. overflow.c: In function `funb':
  3. overflow.c:11: warning: assignment from incompatible pointer type
  4. [monnand@monnand-host lecture]$ ./a.out
  5. AAAAA[monnand@monnand-host lecture]$
复制代码

[ 本帖最后由 默难 于 2006-8-18 00:12 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-08-18 09:12 |只看该作者
原帖由 whyglinux 于 2006-8-17 22:37 发表


表达式 i[-1] = 12 应该等价于 *(i - 1) = 12。注意不应该再用 -1 乘以 sizeof(int)。

i 是一个数组,表示第一个元素的地址,所以把这个地址写成 (int *)&i 不可取,直接用 i 表示即可。



对于32位机来说 *(i-1)=12 是错的 而(-1 * sizeof(int)) 才是严密的

论坛徽章:
0
9 [报告]
发表于 2006-08-18 09:48 |只看该作者
原帖由 giniouswr 于 2006-8-18 09:12 发表
对于32位机来说 *(i-1)=12 是错的 而(-1 * sizeof(int)) 才是严密的


whyglinux是对的

[ 本帖最后由 JohnBull 于 2006-8-18 09:49 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-08-18 10:55 |只看该作者
main函数的返回地址被改写成了0x00000012,则main返回后该process crash.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP