鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 小甲鱼

[技术交流] 【悬赏促学习】栈溢出举例,已提升悬赏金额求精品代码

  [复制链接]
发表于 2011-11-26 19:43:58 | 显示全部楼层
这个我仅仅知道如何改变函数返回的地址,给两个示例程序,都是在VC6下执行的,在其它编译器上没试过,可能有问题
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. void why_here(void) /*这个函数没有任何地方调用过 */
  4. {
  5.         printf("Buffer overflow ?!\nDo you know why?\n");
  6.         exit (0);
  7. }
  8. int main( )
  9. {
  10.         int buff[1]; //只有burr[0]才是合法的
  11.         buff[2]=(int)why_here;/*覆盖main函数的返回地址*/
  12.         return 0;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 19:44:19 | 显示全部楼层
还有一个
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. void  f()
  4. {
  5.         int buf[1];
  6.         buf[2]+=7;
  7. }

  8. int  main()
  9. {
  10.         int x;        
  11.         x = 0;
  12.         f();
  13.         x = 1; //这句将被跳过
  14.         printf("%d ", x);
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-27 06:13:05 | 显示全部楼层
我看到过类似的   不知道是不是   他是把栈都初始化成int 3中断了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-27 10:46:18 | 显示全部楼层

(&g_nTest)[1] = 0;是什么??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-27 15:36:10 | 显示全部楼层
  1. int stack_overflow()
  2. 2
  3. {
  4. 3
  5.     stack_overflow();
  6. 4
  7. }
  8. 5

  9. 6
  10. int main()
  11. 7
  12. {
  13. 8
  14.         stack_overflow();
  15. 9
  16. }
复制代码
以上代码,既没有返回值.又循环调用.肯定会溢出的,毫无价值可言.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-27 15:42:18 | 显示全部楼层
void test010()
{
char c;
/*
...
*/
printf("Is go on?(Y/N):");
scanf("%s", &c);
printf("\n");
if(c == 'Y' || c == 'y')
  test010();
}

当我输入'y'时,程序可以正常运行下一步:再一次调用方法本身,但当我输入其它字母时,程序执行到最后一个大括弧的时候报错。
错误提示:
Run-time Check Failure #2 - Stack around the variable ‘c’ was corrupted.
错误原因:scanf(%s,%c)
编译器会自动带一个'\0'串结束符,溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-28 19:58:58 | 显示全部楼层
neur2520 发表于 2011-11-25 21:47
小甲鱼的这个题目算是给我做复习用了,都忘得差不多了,研究了半天,才研究清楚简单介绍下:这个是利用静态 ...

貌似静态变量只能被初始化一次吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-28 20:07:01 | 显示全部楼层
sky! 发表于 2011-11-27 10:46
(&g_nTest)[1] = 0;是什么??

我也不懂,哪问解释一下?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-28 20:21:23 | 显示全部楼层
HACKER 发表于 2011-11-26 17:54
#include   int main()   {   char name(8);   printf("Please type your name:");   gets(name) ...

你能给我将详细点吗?我调试了但是有多少字符显示多少啊,完全不受char【8】的限制、、、
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-12-5 13:20:54 | 显示全部楼层
我只知道在调用api的时候参数中加上一大堆字符串,就会产生溢出.覆盖掉原来的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-12-11 15:54:17 | 显示全部楼层
我觉得栈溢出这个不太好弄,要找漏洞的,我的水平还不够,就引号里的话比较容易理解,也比较好操作一些
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-12-11 22:27:02 | 显示全部楼层
好简单的一个: 就是利用递归了, 没有终结条件递归就自然的出现栈溢出咯! 嘻嘻!

简单写个吧:
  1. #include <stdio.h>

  2. int fun(int n)
  3. {
  4.     return ( n * fun( n * n ) );
  5. }

  6. void main()
  7. {
  8.    int i;
  9.    int n = 2;
  10.    i = fun(n);
  11.    printf("i = %d\n", i);

  12. }
复制代码
结果: stack.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-12-21 21:59:51 | 显示全部楼层
简单,只要用汇编写个除法运算就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-21 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表