杨嘉健

杨嘉健的博客

他的个人主页  他的博客

我觉得是被晃了,求助

杨嘉健  2011年03月17日 星期四 12:52 | 2990次浏览 | 4条评论

有一朋友的日志求问说这个程序输出什么,我觉得至少在pc环境下面打死打不死我都会说都是1啊……

但是看别人留言就说,这个function会导致main跳过x=1那句…这个我就彻底不明白了…

这个反正我觉得我精神正常的话绝对不会写这种东西的……求高手指点……啊啊啊疯了要……

#include<stdio.h>
#include<stdlib.h>

int function(int a, int b, int c)
{

char buffer[14];

int sum;

int *ret;

ret = buffer + 28;
  (*ret) += 10;
  sum = a+b+c;
  return sum;
}

int main(void)
{
  int x;
  x = 0;
  function(1,2,3);
  x = 1;
  printf(" %d \n", x);

  return 0;
}

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
孔志奎

回复 孔志奎  2011年03月26日 星期六 10:30

int function(int a, int b, int c)
{

char buffer[14];
...
ret = buffer + 28;

(*ret) += 10;

第一句导致 ret 溢出了 function 函数的堆栈, 正好覆盖了function函数的返回地址; function函数参数和局部变量占用的堆栈空间为14+sizeof(int)*3=26, 返回地址在堆栈偏移26~30之间, 考虑指针的地址对齐, 所以返回地址应该是在堆栈偏移28处, 正是ret指向的地方;
第二句修改了ret的值, 也就是修改了function函数的返回地址, 也就是修改了pc指令寄存器, +10, 应该跳过了x=1这一句; 甚至有可能会跳过printf语

这本来就不是一个正经程序, 这应该是一个堆栈溢出的演示程序; 如果修改ret指向一段恶意代码, 这就是一个堆栈溢出攻击的演示程序了.

1条回复

  • 杨嘉健

    回复 杨嘉健  2011年03月26日 星期六 13:47

    嗯嗯意识到了……这东西本来是想去改eip的……
    ms写病毒的都会这东西……

    0条回复

许鹏飞

回复 许鹏飞  2011年03月18日 星期五 11:32

什么情况下会导致程序跳过x=1这步? 当然是在编译器出bug的情况下会出现 这种情况。
不用纠结了。由于有返回值的function没有写返回值的时候跳过下面赋值语句执行这种情况没有遇到过。如果遇到了就说明编译器出bug了。

1条回复

  • 杨嘉健

    回复 杨嘉健  2011年03月18日 星期五 23:23

    我也觉得是啊……所以说我就觉得问这个问题的就不应该是正经写程序的……

    0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号