能力值:
( LV2,RANK:10 )
|
-
-
101 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
102 楼
有点不明白,在哪里溢出的呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
103 楼
studying
.
|
能力值:
( LV2,RANK:10 )
|
-
-
104 楼
好東西啊,下載了慢慢消化
|
能力值:
( LV2,RANK:10 )
|
-
-
105 楼
图文并茂,写的真好!
|
能力值:
( LV2,RANK:10 )
|
-
-
106 楼
收藏下学习。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
107 楼
greate
|
能力值:
( LV2,RANK:10 )
|
-
-
108 楼
写的很详细啊,正好适合我们这样的新手,太感谢了
|
能力值:
( LV5,RANK:60 )
|
-
-
109 楼
great
|
能力值:
( LV2,RANK:10 )
|
-
-
110 楼
学习了,很强大。
|
能力值:
( LV2,RANK:10 )
|
-
-
111 楼
针对缓冲区的部分 还真是有点不明白的啦 多了解看看
|
能力值:
( LV2,RANK:10 )
|
-
-
112 楼
写的不错呢
新手学习了啊
|
能力值:
( LV2,RANK:10 )
|
-
-
113 楼
请问,这句"在windows上,不幸的是这个栈起始地址很低,0x00130000,所以无法保证没有00字节出现这个要求,而且多线程的特性,有使得这个值变化不定,更不可能事先计算出来“能不能解释下,菜鸟看不懂
|
能力值:
( LV5,RANK:60 )
|
-
-
114 楼
很久没有看这个帖子了。因为没有做这个方向的,所以大家的疑问没有及时回复。
再者我也是初学者。所以有很多的地方自己也不甚明白。
关于你的这个问题应该是这样的。
高地址: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中去。
不知说清楚没有。没有的话自己再找些相关的资料来看下吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
115 楼
回复看有多少Kx 币
|
能力值:
( LV3,RANK:20 )
|
-
-
116 楼
楼主写得不错
|
能力值:
( LV2,RANK:10 )
|
-
-
117 楼
大概看懂了,不过我有个问题就是为什么非得用char,不可以用BYTE吗?这样不就不需要拷贝字符串了,还有拷贝字符串也可以不用那些函数,可以自己判断结束
|
能力值:
( LV3,RANK:20 )
|
-
-
118 楼
思路很清晰,文章不错。顶!
|
能力值:
( LV2,RANK:10 )
|
-
-
119 楼
感谢楼主无私奉献
|
能力值:
( LV2,RANK:10 )
|
-
-
120 楼
|
能力值:
( LV5,RANK:60 )
|
-
-
121 楼
其实char就是byte.这里其实 说明的就是一种针对strcpy函数可能出现的这一个漏洞而展开的讨论,当然拷贝时不能让它被0截断了.如一些网络传送的数据一般都会有一个域来表明传送的数据的长度.有可能它就是用的是memcpy,不过这样的说应该一般是在堆上分配内存.也就是说一般会进行比较严格的长度检查.这样出现漏洞的机会就更小了.
|
能力值:
( LV2,RANK:10 )
|
-
-
122 楼
感谢楼主带我入门,今生今世无以为报
|
能力值:
( LV2,RANK:10 )
|
-
-
123 楼
/*
pop eax;
push eax;
//相当于先弹到eax中,得到了第一个结构体的地址。再入栈就是最后一个参数的指针。
*/
这个看不懂- - 请赐教
还有啊 你说的韩老师是谁呀~ 我才入门,都不知道有哪些大神 。
能告知学习这方面知识的途径么。
|
能力值:
( LV2,RANK:10 )
|
-
-
124 楼
Very Good!
|
能力值:
( LV2,RANK:10 )
|
-
-
125 楼
mark for next time
|
|
|