首页
论坛
专栏
课程

[原创]缓冲区溢出攻击浅析,写给初学者

2011-3-25 12:04 20703

[原创]缓冲区溢出攻击浅析,写给初学者

2011-3-25 12:04
20703
最新回复 (129)
黑仔猪 2011-7-4 10:02
101
0
学习了~谢谢分享
ninino 2011-7-4 15:41
102
0
有点不明白,在哪里溢出的呢?
smallfishl 2011-7-4 15:49
103
0
studying
.
nin 2011-7-4 16:42
104
0
好東西啊,下載了慢慢消化
nerdpal 2011-7-28 13:10
105
0
图文并茂,写的真好!
jacalhu 2011-7-28 13:49
106
0
收藏下学习。。。
RockyBoy 2011-8-18 15:08
107
0
greate
angelwf 2011-8-18 16:15
108
0
写的很详细啊,正好适合我们这样的新手,太感谢了
firfor 1 2011-8-19 00:15
109
0
great
D。s 2011-8-19 10:49
110
0
学习了,很强大。
zccz 2011-8-19 17:50
111
0
针对缓冲区的部分 还真是有点不明白的啦 多了解看看
接下来 2011-8-24 17:12
112
0
写的不错呢
新手学习了啊
xuedongzhi 2011-11-21 20:08
113
0
请问,这句"在windows上,不幸的是这个栈起始地址很低,0x00130000,所以无法保证没有00字节出现这个要求,而且多线程的特性,有使得这个值变化不定,更不可能事先计算出来“能不能解释下,菜鸟看不懂
firfor 1 2011-11-22 10:35
114
0
很久没有看这个帖子了。因为没有做这个方向的,所以大家的疑问没有及时回复。
再者我也是初学者。所以有很多的地方自己也不甚明白。
关于你的这个问题应该是这样的。
高地址:EIP
            EBP(标准栈帧,有的程序,特别 是在release)版本有各种情况
低地址:局部变量空间
        xxxx
            xxxx
            xxxx
            xxxx<----这个就假如是一个char buffer[16]的起始地方吧。
大家知道在x86机器中。DF标志位一般为0也就是在拷贝字串的时候会往高地址方向拷。
所以字串的最后的字节会往eip在的地方靠近。当超过了buffer预分配的长度的时候就有
会把EIP值给覆盖掉。 这个应该你理解了。现在往这个char buffer中赋值的时候一般用的是
strcpy这样的字串拷贝函数。所以它是以字串的\0结束符来判断一个字串到底拷贝完全没有。
这样就完全 有可能超过上面给出的16字节的预留空间。因为只要这个字串太长久久没有出现
\0结束符。这样就会溢出了。而我们要利用这一个溢出。只能在这们能够控制这一个拷贝到buffer
中的字串源。也就是说:
                    程序中有可能出现的strcpy把某一个串拷到这个buffer中去。而这一个源串
                    是我们自己输入的。这样就们就有可能构造shellcode。
上面说了若是用strcpy函数:而这一个函数是以\0来判断一个字串是否结束的。也就是说我们输入的数据中不能在中间有内码为0的数据。不然就是拷贝截断。
但是这有一个问题。若直接把EIP赋值成自己的shellcode所在的地址的话。必定要写入中间有0的数据。因为windows的栈的地址很低。所以我们的shellcode在栈上的话。我们的shellocde 的入口地址中必定有0.如0x00 80 00 00 这四个字节为我们的shellcode的地址。但是把这一个值写到了EIP所在的栈上位置,则再往上我们的shellcode就被截断了。所以这是一个问题。因此不能直接跳到我们的代码所在的地方。要找一个跳板 jmp esp。
1:ret返回后把栈中的值写入了eip寄存器中去了。而这个值已经被我们修改过了。
2:当然那个jmp esp 所在的地址中不能有0字节。这样在windows的高地址中去找这么一条指令。
3:ret 后。执行eip指向的指令。jmp esp 。请记得:上面的ret后。esp不再指向eip值。已经向上移一个位置了。因此jmp esp 刚好把下一条执行指令跳转到我们的shellcode中去。
不知说清楚没有。没有的话自己再找些相关的资料来看下吧。
fzman 2011-11-22 11:06
115
0
回复看有多少Kx 币
kxzjchen 2011-11-22 11:10
116
0
楼主写得不错
xuedongzhi 2011-11-22 20:29
117
0
大概看懂了,不过我有个问题就是为什么非得用char,不可以用BYTE吗?这样不就不需要拷贝字符串了,还有拷贝字符串也可以不用那些函数,可以自己判断结束
devalone 2011-11-22 22:00
118
0
思路很清晰,文章不错。顶!
radar蝙蝠 2011-11-23 02:10
119
0
感谢楼主无私奉献
lvpiggy 2011-11-23 08:30
120
0
感激不尽
firfor 1 2011-11-23 10:16
121
0
其实char就是byte.这里其实 说明的就是一种针对strcpy函数可能出现的这一个漏洞而展开的讨论,当然拷贝时不能让它被0截断了.如一些网络传送的数据一般都会有一个域来表明传送的数据的长度.有可能它就是用的是memcpy,不过这样的说应该一般是在堆上分配内存.也就是说一般会进行比较严格的长度检查.这样出现漏洞的机会就更小了.
lvpiggy 2011-11-23 10:20
122
0
感谢楼主带我入门,今生今世无以为报
lvpiggy 2011-11-23 13:57
123
0
/*
    pop   eax;
    push  eax;
//相当于先弹到eax中,得到了第一个结构体的地址。再入栈就是最后一个参数的指针。
    */

这个看不懂- - 请赐教

还有啊 你说的韩老师是谁呀~   我才入门,都不知道有哪些大神 。
能告知学习这方面知识的途径么。
jimmyleeee 2011-11-23 16:43
124
0
Very Good!
realright 2011-11-23 19:44
125
0
mark for next time
chudech 2011-11-24 10:32
126
0
谢谢楼主分享!!!
GUARD宝贝 2011-11-24 20:43
127
0
太简单了,很容易看懂。这是在高级语言在出现的问题,在汇编设计中是很少犯这种错误的
firfor 1 2011-11-25 00:20
128
0
呵呵,韩老师是谁就不方便透露啦,不过你可以上万方搜索相关的资料,如安全方面的也许就能找到他了.
唉,好久没有来看自己写的代码了.现在看起来觉得自己当时写得好幼稚.
关于你问的这一个问题.
上面有一个call next3:指令看到没.一次call相当于是
[COLOR="DarkRed"]push[/COLOR] EIP_next_instruction_address
[COLOR="DarkRed"]jmp[/COLOR]   next3

我们call这一个指令的调用就是为了得到下一条指令的地址.也就是那个start_information结构体的偏移地址啦.得到了EIP后,我们应该把它给弹出来保存起来.
pop eax

再待要用到这一个结构体的地址的时候,我们再把它给push到栈中去.然后调相应的函数.
push eax

你足够细心的话会发现我们若把它保存到eax中暂存起来的话.下面要用到的时候再
push eax

把地址压入栈中作为参数.一次pop后紧接着又是push.相当于什么都没有做.对栈没有改变.那么什么保留这两条
pop eax
push eax

呢.就是以后会再用到那个结构体的地址的情况下会保留两条指令.因为我们不会再用到这一个结构体的地址了,所以我们不用保存eip的值到eax中.而一次pop 加一次push指令对栈又没有影响.
所以就索性省略两条指令了.也就把它两条注释起来了的.
意思就是说不注释也同样可以.程序逻辑更清晰.
不知明白否.
firfor 1 2011-11-25 00:22
129
0
见笑了,本来就是自己做来自己溢出的.没有什么技术含量
htg 2 2017-11-27 15:43
130
0
文章写的不错
游客
登录 | 注册 方可回帖
返回