能力值:
( LV12,RANK:300 )
|
-
-
26 楼
push 0
push 40606c
call @next
db 'E', 0, 'x', 0, 'p', 0, 'l', 0, 'o', 0, 'i', 0, 't', 0, 20h, 0, 's', 0, 'u', 0, 'c', 0, 'c', 0, 'e', 0, 's', 0, 's', 0, 0, 0
@next:
push 0
call dword ptr [408510]
对LZ内容最简单的优化,一个call非零字节只算两字节,就可以省掉好几个push了
|
能力值:
(RANK:250 )
|
-
-
27 楼
呵呵,谢谢小聪指点。立本贴的目的就是把爱迪生最先的那个小板凳拿出来让大家批判。至于得精不得精倒是小事,能引起大家讨论才好,仅仅怀疑论的回帖倒不如,直接对文中思路进行批判来得猛烈。
|
能力值:
( LV3,RANK:20 )
|
-
-
28 楼
话说你的ls还真想把success接到那个不可写的Exploit后边,哈哈哈...
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
我是来围观的。
|
能力值:
( LV6,RANK:90 )
|
-
-
30 楼
嗯,kernel部分是不可写的..如果接到原来"ExploitMe"字符串后面..就会破坏标题了..
|
能力值:
(RANK:600 )
|
-
-
31 楼
我的挫答案:
esp在0012FC50
我文件中把参数预设好,花了6个字节
然后esp加一个常数,直接call
0012FC78 83C4 64 ADD ESP,64
0012FC7B FF15 10854000 CALL DWORD PTR DS:[408510] ; user32.MessageBoxW
又花了8个字节...
唉..
那个字符串exploit success不好弄o
|
能力值:
( LV10,RANK:160 )
|
-
-
32 楼
啊,第一次溢出成功啊,很去有趣的啦
我的WIN7下地址是0012FC44
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
硬编码堆栈的分配地址,不太靠谱吧??
|
能力值:
( LV3,RANK:30 )
|
-
-
34 楼
大牛说,要是使用xx 可以o字节的~哎都是神人啊 可惜我连这个题目都不能理解到底是什么本质的问题~~
|
能力值:
(RANK:10 )
|
-
-
35 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
呵,很久没来了,顺便借楼报到下
|
能力值:
( LV12,RANK:300 )
|
-
-
37 楼
我个人还是觉得,在发现了利用的原理并完成了像这样的POC之后,进一步考虑的,应该是如何抛弃对栈地址的硬编码,利用系统dll中已存在的指令稳定地跳到堆栈的shellcode中,从而使得在所有XP SP3系统都能基本实现正常触发。
但是现在大家贴出来的讨论好像大多数集中在怎么优化shellcode的内容使之更短小上,我是觉得如果正常触发的适用性无法保证的话,就很可能连前五十分都拿不到。
为了避免依赖具体堆栈范围,我当时想过一个思路,但是没有完全做成:
我是从后推到前面。
首先假设我们可以指挥call [edx]跳到我们想要的地址。
这样我们首先考虑要跳到哪个地址,即call进去的第一条指令要干嘛。
注意我这里不能直接跳到堆栈里的shellcode,因为我假设不知道堆栈的范围。这样就必须利用对esp的操作指令。
注意到call [edx]进入后,此时esp+28h开始就是原exploitme.dat文件的内容,即我们可以控制的。
因此,我想到,我们可以找到系统dll中的这样一个命令序列:
add esp, xx
retn yy
其中xx不小于28h,xx+yy+4-28h不大于7Eh。
找到了这样一条指令作为call [edx]的目标,则我们就可以在exploitme.dat的相应位置(xx-28h处)指定该指令retn的地址。
只要这个retn的目标指定为一条jmp esp指令,则这样retn之后经过jmp esp就进入了exploitme.dat相应位置(xx+yy+4)使该位置的shellcode指令得到执行的机会。
这两种需要的指令都可以找到,前者在USP10.DLL有好几个add esp 28, retn yy的指令,刚好满足要求,后者jmp esp指令则是大家在漏洞利用中很常用的,自然也有。因此这部分问题都有可能解决。
于是剩下的是要进入这个流程,即要找到一个可以填充进[esp+A4]的地址(不能是在堆栈,只能是在进程模块空间找一个已存在的),使得[[esp+A4]]的值刚好是前面所说的add esp 28, retn yy指令的地址。这样就可以实现整个流程:
[esp+A4](可控制)进入edx->[edx]为add esp 28, retn yy指令->执行add esp 28, retn yy(用于retn的返回地址可控制)->retn到jmp esp指令->jmp esp指令执行,最终进入堆栈中的shellcode。
以上是我想的思路。
实际过程中,当时我是20日半夜才看到这题目,花了一些时间找了一下,我找到了USP10.DLL中的几条add esp 28, retn yy的指令和user32.dll中的jmp esp指令,但是搜索了一下,在可执行模块中没有找到能够刚好保存有那几条add esp 28, retn yy指令的地址的可用指针。
到此我没有在继续找下去,因此我最终没有完成实现这个思路。
因为我当时时间有限,也不是奔着比赛来的,就只是想一想,一时没有完全搞通,就没有在搞下去了,不知道类似这样的思路是否有人实现了。我也很想知道有没有其他的思路能够更容易地实现,因为我这个思路毕竟跳板用得多了点,还要多少靠点运气来碰上。
我把自己不成熟的想法分享出来,也是希望大家能像楼主希望的那样讨论起来。
对我自己而言,漏洞分析过几个,但是着重于漏洞产生原因,而并没有把重点放在怎么应用上,所以这些跳板地址也是从没有储备,都是临时找的,这样在时效和稳定性上肯定要吃亏,毕竟不是成熟的漏洞利用者啊。
|
能力值:
(RANK:250 )
|
-
-
38 楼
其实我感觉出题者的主要意图并不是让大家搞如何利用,字节最少的要求已经上升到了,汇编技巧的比拼,这个题目中漏洞的触发也不是缓冲区溢出引起的,真正的作为一个explioter就和小聪说的一样稳定性和通用性在先,汇编的精妙已经高出漏洞利用的档次了。
我过段时间会放几个poc让大家玩玩,感受下从poc到exploit这种底层工作的艰辛。
|
能力值:
( LV6,RANK:80 )
|
-
-
39 楼
刚刚玩溢出的菜鸟有个疑惑。这个exploitme用到了堆,就是堆溢出了吗(求教)?那为什么构造了84h的exploit.dat后出现的错误跟栈溢出类似,要是堆溢出的话,直接返回buffer开始地址可行吗?谢谢大牛指点迷津,为了这个exploitme花了好长时间学习堆溢出,然后构造后发现不成功,呵呵。。。。
|