首页
社区
课程
招聘
关于溢出的 方法
发表于: 2008-5-1 11:21 4468

关于溢出的 方法

2008-5-1 11:21
4468
看西方必败 老师的文章,知道常见溢出的方向大概有2种
一种是用大量nop覆盖内存,也就是堆喷散技术,最后一定会执行到shellcode的
另外一种是跳到esp,指向覆盖esp后面内容的shellcode..

第二种方法我想不明白,
如果我们要溢出一个程序,想要运行shellcode,必须知道自己写的shellcode覆盖到的地址,取得这个地址用esp法可以很方便的得到:eap.问题是如何跳转到esp,要返回的原程序代码中一般是碰不到jmp esp的.
可以让返回的eip=esp,但这样得实现知道堆栈地址,实践中做不到
让返回的eip="jmp esp"的地址,这个是老师推荐的方法,可是如何得到这个"jmp esp "的地址呢?
只有在系统里面找通用"jmp esp"点?
或者有其他办法让被溢出系统运行"jmp esp"?
但如果已经办法让被溢出系统运行某段代码了,直接运行shellcode即可啊!
于是这个思路只有用一个固定地址的"jmp esp"了?
这样不和linux下面的溢出一样了?
windows的"堆栈不固定"不会影响吗?

看到一个中文通用"jmp esp"地址
自己测试了下确实是这样,那这些通用地址会不会出现意外呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
能够直接运行shellcode的前提(即肯定返回地址到shellcode中的前提)是,你可以确定shellcode的位置。然而在实际的溢出中,你很难保证shellcode在堆栈中的绝对位置。
所以我们采取这样的方式:先从系统dll中找到一句jmp esp,然后覆盖函数返回地址为这一句命令的地址,这样函数返回执行这一句命令,而此次esp处恰好是我们的shellcode的开始,这样就进入shellcode中执行。

可见,我们没有办法肯定shellcode的绝对地址,因此准确地修改返回地址为shellcode绝对地址,以实现“直接运行shellcode”,是不保险的。
但是,我们可以通过使用一个系统通用的"jmp esp"指令的绝对地址来覆盖函数返回值,而又能保证这时esp处正是shellcode的开头,因此就可以通过这一个跳板来跳入shellcode。

因此“有办法让被溢出系统运行某段代码”与“让被溢出系统直接运行shellcode”是不等价的。

jmp esp跳板的作法,成功与否(会不会有意外)就看这个jmp esp的指令位置选得好不好了。对于kernel32.dll等这些dll,选得好的话,同一个版本系统中的地址一般是不变的。
2008-5-1 19:37
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我知道不等价
我的问题不是"不知道怎么溢出",而是这种溢出的思想,前提是必须得到一个通用的 "jmp esp "的地址,是否这样?
是则我们也许需要有更好的思路来溢出了...
看原文的的shellcode就是调用一个固定"jmp esp"地址,这只是提高了硬地址的成功率,谈不上一个新思路吧?
或者"jmp esp "这思想有另外的路径?
2008-5-2 14:48
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
顶下..
我的说法没错,现有的常见溢出思路还是得找到一个固定的地址来作为溢出时的跳板(这个跳板的作用无论)
操作系统和PC的现有机制一定有设计漏洞的,用它的疏忽来作为溢出思路..
2008-5-5 20:14
0
雪    币: 202
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看完后,真是受益匪浅啊

看来还得多多努力才行
2008-5-5 22:23
0
游客
登录 | 注册 方可回帖
返回
//