YY指针堆栈,测试你的基础知识。

积木 2005-12-03 09:12:31
一个小bt写的,转过来,不运行猜猜这个程序的运行结果。

#include <stdio.h>

int funa(void)
{
printf("AAAAA");
exit(3);
return 0;
}

int funb(int (*p)(void))
{
char *h;
h = &h;
/* point to the first variable */

h += sizeof(char *);
/* point to the old ebp */

h += sizeof(char *);
/* point to the return address */

(*(int (**)(void))(h)) = p;
return 0;
}

int main()
{
funb(funa);
return 0;
}

...全文
1789 105 打赏 收藏 转发到动态 举报
写回复
用AI写文章
105 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kvci 2006-04-01
  • 打赏
  • 举报
回复
就是函数指针
对不?
xombat 2006-04-01
  • 打赏
  • 举报
回复
缓冲区溢出,
溢出攻击一般分为崭溢出攻击和堆溢出攻击
基本原理是覆盖程序正常路径,使程序走向自己设定的函数入口
______________________________________________
由这个小程序,想到这里,令我突然豁然开朗,谢谢了!
bombwang 2006-04-01
  • 打赏
  • 举报
回复
mark
0黄瓜0 2006-04-01
  • 打赏
  • 举报
回复
////////////////
//楼主的程序还可以这样写
#include <stdio.h>

int funa(void)
{
printf("AAAAAA\n");
exit(3);
return 0;
}

int funb(int (*p)(void))
{
char *h=(char*)&p;
h-=sizeof(char *);

(*(int (**)(void))(h)) = p;
return 0;
}//

int main()
{
funb(funa);

return 0;
}
0黄瓜0 2006-04-01
  • 打赏
  • 举报
回复
////////////////////////////////////
//这样改动一下,可以又反回main()

#include <stdio.h>
int funa2(void)
{
printf("AAAAA\n");
char *h=0;
h = (char *)&h;
h+=8;
(*(int (**)(void))(h)) = (int (*)(void))0x4014f2;//这个值根据第二次移动指针后h内的值改
//exit(3);
return 0;
}

int funb2(int (*p)(void))
{
printf("函数指针p指向的函数地址:0x%x\n",p);
printf("函数指针p本身的地址: 0x%x\n",&p);


char *h=0;
h = (char *)&h; //* point to the first variable
printf("指针h的地址: 0x%x, h内的值0x%x:\n",h,*(int*)h);

h+= sizeof(char *); //* point to the old ebp
printf("第一次移动指针后h的地址:0x%x, h内的值0x%x:\n",h,*(int*)h);
h += sizeof(char *); //* point to the return address
printf("第二次移动指针后h的地址:0x%x, h内的值0x%x:\n",h,*(int*)h);//

/*
两次改变相当于 h+=8;
*/

(*(int (**)(void))(h)) = p;
printf("指针h的地址: 0x%x, h内的值0x%x:\n",h,*(int*)h);
return 0;
}//函数结束,不是返回main,而是跳转去执行funa().


int main()
{
funb2(funa2);
printf("main() \n");
exit(3);
return 0;
}
0黄瓜0 2006-04-01
  • 打赏
  • 举报
回复
#include <stdio.h>

int funa(void)
{
printf("AAAAAA\n");
exit(3);
return 0;
}

int funb(int (*p)(void))
{
printf("函数指针p指向的函数地址:0x%x\n",p);
printf("函数指针p本身的地址: 0x%x\n",&p);


char *h=0;
h = (char *)&h; //* point to the first variable
printf("指针h的地址: 0x%x, h内的值0x%x:\n",h,*(int*)h);

h+= sizeof(char *); //* point to the old ebp
printf("第一次移动指针后h的地址:0x%x, h内的值0x%x:\n",h,*(int*)h);
h += sizeof(char *); //* point to the return address
printf("第二次移动指针后h的地址:0x%x, h内的值0x%x:\n",h,*(int*)h);

/*
两次改变相当于 h+=8;
*/

(*(int (**)(void))(h)) = p;
printf("指针h的地址: 0x%x, h内的值0x%x:\n",h,*(int*)h);
return 0;
}//函数结束,不是返回main,而是跳转去执行funa().

int main()
{
funb(funa);
printf("main() \n");
exit(3);
return 0;
}
winnuke 2006-04-01
  • 打赏
  • 举报
回复
好老的帖子...

多看汇编代码
OpenHero 2006-04-01
  • 打赏
  • 举报
回复
嘿嘿,强烈要求CSDN支持HTML编辑~~~~
支持
那就更危险啦~~hoho
积木 2006-04-01
  • 打赏
  • 举报
回复
嘿嘿,强烈要求CSDN支持HTML编辑~~~~
最好支持javascript.
Wolf0403 2006-04-01
  • 打赏
  • 举报
回复
强烈要求 CSDN 支持 <pre> 标签。。鄙视变宽字体!!
Wolf0403 2006-04-01
  • 打赏
  • 举报
回复
$ cat /proc/self/maps
08048000-0804c000 r-xp 00000000 08:01 15730 /bin/cat
0804c000-0804d000 rwxp 00003000 08:01 15730 /bin/cat
0804d000-0806e000 rwxp 0804d000 00:00 0 [heap]
b7dd9000-b7dda000 rwxp b7dd9000 00:00 0
b7dda000-b7f04000 r-xp 00000000 08:01 126706 /lib/tls/libc-2.3.2.so
b7f04000-b7f0d000 rwxp 00129000 08:01 126706 /lib/tls/libc-2.3.2.so
b7f0d000-b7f0f000 rwxp b7f0d000 00:00 0
b7f12000-b7f13000 rwxp b7f12000 00:00 0
b7f13000-b7f29000 r-xp 00000000 08:01 157781 /lib/ld-2.3.2.so
b7f29000-b7f2a000 rwxp 00015000 08:01 157781 /lib/ld-2.3.2.so
bfb13000-bfb29000 rw-p bfb13000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]

为什么 heap 和 stack 要设置成 x 的呢?
kobefly 2006-04-01
  • 打赏
  • 举报
回复
老帖子了啊

以前怎么没看到呢

顺便顶一把

昨天也刚看过点这方面的东西, 堆栈可执行之后, 就会造成很多缓冲区溢出漏洞

据说相当大一部分的攻击都是有关缓冲区溢出的啊

昨天之前还不知道bss段是干吗的

汗啊
sjjf 2006-04-01
  • 打赏
  • 举报
回复
先mark
我啃 2006-04-01
  • 打赏
  • 举报
回复
来了,饼子堂的来了,又是玩弄堆栈的……,
manplus 2006-04-01
  • 打赏
  • 举报
回复
mrk
逸学堂 2006-03-31
  • 打赏
  • 举报
回复
编译基础啊。。。
mp6 2006-03-31
  • 打赏
  • 举报
回复
mark
jinjiajie 2006-03-31
  • 打赏
  • 举报
回复
hehe,大致意思了解了,但是有个疑问,为什么函数内的变量地址会在返回地址前呢?
ytfrdfiw 2006-03-31
  • 打赏
  • 举报
回复
先顶
lei001 2006-03-31
  • 打赏
  • 举报
回复
mark
加载更多回复(85)

69,373

社区成员

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

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