首页
社区
课程
招聘
[旧帖] [原创]缓冲区溢出的简单例子,适合初学者 0.00雪花
发表于: 2010-4-4 11:01 5345

[旧帖] [原创]缓冲区溢出的简单例子,适合初学者 0.00雪花

2010-4-4 11:01
5345

前几天在PYG里面看到了一段代码,很有意思,差点就把我给迷惑住了,在经过Think之后,想通了其中的猫腻,为了验证一下想法,就把代码编译运行,然后用OD跟了一下,确认了一下自己的想法。个人认为这是一个新手理解缓冲区溢出的很不错的例子,同时也可以锻炼一下自己的逆向分析能力,其实很简单,大牛们请飘过,新手可以参考学习一下。希望版主能发个邀请码,如果能加精的话那就再好不过了,小弟感激涕零。嘻嘻

首先请看那段代码(C语言):

#include<stdio.h>
void main()
{
  int i=0;
  int a[]={1,2,3,4,5,6,7,8,9,10};

  for(i=0;i<=10;i++)
  {
    a[i]=0;
    printf("Hello World!\n");
  }
}
00401270  |.  8B15 8C>mov edx,dword ptr ds:[427C8C]
00401276  |.  52      push edx
00401277  |.  A1 847C>mov eax,dword ptr ds:[427C84]
0040127C  |.  50      push eax
0040127D  |.  8B0D 80>mov ecx,dword ptr ds:[427C80]
00401283  |.  51      push ecx
00401284  |.  E8 7CFD>call Text.00401005             ;/////////注意,这是Main函数,F7跟进

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (24)
雪    币: 136
活跃值: (1470)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
楼主写的不错,支持一个
2010-4-4 11:11
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
3
楼主写的不错哦,动手能力比我强,
不过严格说这个只能算数组越界访问,还不算栈溢出
可以看看failwest大大的漏洞分析专题
http://bbs.pediy.com/showthread.php?t=56445
相信能写出这样的文章,看完这个一定会对溢出攻击有更深刻的了解
2010-4-4 16:55
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错吗?值得学习。
2010-4-4 17:04
0
雪    币: 727
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习学习...........
2010-4-4 18:15
0
雪    币: 521
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
多谢指点,呵呵,我去看看,大家一起学习讨论哈
2010-4-4 18:35
0
雪    币: 364
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
原来a[10]=0; 时VC不报错的 呵呵
2010-4-4 18:52
0
雪    币: 521
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=ghban;785908]原来a[10]=0; 时VC不报错的 呵呵[/QUOTE]

呵呵,在C和C++中,数组名相当于指针,可以直接访问内存,在数组越界时,是不报错的,这一点在C#和Java中的是不会出现的,因为他们依赖于虚拟机,编译时出现数组越界会直接报错,不会出现上面的情况。
2010-4-4 19:21
0
雪    币: 133
活跃值: (113)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
过来膜拜failwest大大的
2010-4-4 19:45
0
雪    币: 521
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
都这么长时间了,版主怎么还不来翻贴发邀请码呀十几天了都
2010-4-5 17:45
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
非常棒,学习了。
2010-4-5 18:19
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有点茅舍顿开的感觉,谢谢啦
2010-4-5 20:58
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
非常感谢楼主的讲解,只是小弟有一个小问题还不是很了解,希望给小弟讲解一下

在反汇编中有这么一段,下面一段在程序中起了什么作用啊?我怎么感觉没什么作用一样?

0040101C  |.  B9 1B00>mov ecx,1B
00401021  |.  B8 CCCC>mov eax,CCCCCCCC
00401026  |.  F3:AB   rep stos dword ptr es:[edi]
2010-4-6 11:13
0
雪    币: 521
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
这段代码是对在栈中分配的局部变量空间进行初始化
mov ecx,1B                                将1Bh赋值给计数器ECX,表示重复操作1Bh次
mov eax,CCCCCCCC                          将CCCCCCCCh 填充变量空间
rep stos dword ptr es:[edi]               控制循环上面的操作,使用ECX做计数器


非常感谢你的提问,希望能解决你的问题
2010-4-6 12:22
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哦、我想我知道为 堆栈是向下增长的了...
2010-4-10 16:29
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主辛苦了啊,不过这样发的代码看的好累啊,前面从jmp到rep stos都是编译器生成的标准代码,这里要是能说明一下就好了啊

如果能集中关注一下最关键的代码,再精炼一下就更好了,毕竟是写给像我这样的初学者看的嘛,感谢楼主分享。
2010-4-11 21:57
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不错嘛,学习中
2010-4-14 12:00
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这个说穿了就是数组越界覆盖了另一个变量,这样得邀请码太简单了吧
2010-4-14 20:35
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习学习。。。。。。。
2010-4-14 22:03
0
雪    币: 101
活跃值: (1034)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
终于明白什么叫溢出了
2010-4-14 22:52
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
还不错....
2010-4-14 23:41
0
雪    币: 63
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
要是可以再深入下就更好了。。
2010-4-14 23:57
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
呵呵 我是小菜菜,学习了!!
2010-4-15 11:16
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
没完全懂,收下慢慢学习了!
2010-4-15 12:34
0
雪    币: 99
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习学习...........
2010-4-17 13:26
0
游客
登录 | 注册 方可回帖
返回
//