首页
社区
课程
招聘
[翻译]Exploit 编写系列教程第三篇_基于SEH的Exploit(+3b)
2009-11-26 23:13 49547

[翻译]Exploit 编写系列教程第三篇_基于SEH的Exploit(+3b)

2009-11-26 23:13
49547
收藏
点赞7
打赏
分享
最新回复 (33)
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
moonife 8 2009-11-26 23:17
2
0
我写了一个简单的例子来演示文章作者所使用的关键技术,
阅读本篇的朋友可以先用OD跟踪下下面代码出来的程序,
用这个配合着阅读文章,就应该不会被作者翻来覆去的讲解弄晕了 呵呵
.386
.model flat, stdcall
option casemap :none
;====================================
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;====================================
.data
szCap db "By:moonife",0
szInfo db "SEH Based Exploit Demo...",0
szMsg db "Nothing...",0
;====================================
.code
Start:
ASSUME FS:NOTHING
push offset SEH_Handler ;这里写这个纯粹是为了展示 不然可以直接安装Fake_Handler
push fs:[0]
mov fs:[0],esp ;安装SEH
;====================================
;下面模拟缓冲区覆盖过程
mov DWORD ptr[esp],909006EBh ;覆盖 “next SEH”为 jmp $+6 / nop / nop
mov DWORD ptr[esp+4],offset Fake_Handler ;覆盖“SE Handler”为指向pop pop ret指令串的指针
mov BYTE ptr[esp+8],0E9h ;相当于向缓冲区中写入shellcode
lea ebx,[esp+8]
mov eax,offset FakeShellcode-5
sub eax,ebx
mov DWORD ptr[esp+9],eax ;这里写入的“shellcode”为 jmp FakeShellcode
;====================================
xor eax,eax
mov [eax],eax ;制造异常并跳到SEH_Handler进行处理

invoke MessageBox,NULL,addr szMsg,addr szCap,MB_OK ;这里不会被执行了
pop fs:[0]
add esp,4
invoke ExitProcess,NULL
;====================================
SEH_Handler:
invoke MessageBox,NULL,addr szMsg,addr szCap,MB_OK
mov eax,1 ;ExceptionContinueSearch 不处理,需要其他例程或系统接着处理
ret
;====================================
Fake_Handler: ;pop pop ret 指令串 OD跟踪的时候在这里下个断,然后单步
pop edi
pop esi
ret
;====================================
FakeShellcode:
invoke MessageBox,NULL,addr szInfo,addr szCap,MB_OK
invoke ExitProcess,NULL
;====================================
end Start
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2009-11-26 23:23
3
0
还是perl 明了简单啊,编写exploit,perl当属精品!
雪    币: 618
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
dge 6 2009-11-27 11:01
4
0
太速度了,俺得加油了。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
宋梅 2009-11-27 12:03
5
0
学习中呀,总觉得好难
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2009-11-27 13:17
6
0
回复dge:你那篇是本专题的精华所在,也是内容最长的一篇,慢慢翻译,保证质量,呵呵…
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
instruder 4 2009-11-27 13:29
7
0
请教一个问题,这个是异常的过程
_SEHHandler        proc        _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

                pushad
                mov        esi,_lpExceptionRecord
                mov        edi,_lpContext
                assume        esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
               
                mov        eax,_lpSEH
                push        [eax + 0ch]
                pop        [edi].regEbp
                push        [eax + 8]
                pop        [edi].regEip
                push        eax
                pop        [edi].regEsp
                assume        esi:nothing,edi:nothing
                popad
                mov        eax,ExceptionContinueExecution
               
                ret

_SEHHandler        endp       

下面是安装的:
                     assume        fs:nothing
                push        ebp
                lea        eax,[ebx + offset _Error]
                push        eax
                lea        eax,[ebx + offset _SEHHandler]
                push        eax
                push        fs:[0]
                mov        fs:[0],esp
                ;********
t调试的时候红体字部分总是
mov eax,FFFFFFF
00401041  |.  8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]

有可能出现的问题在哪呢?,异常处理程序自己异常了

在此感谢lz的热心翻译及帮助
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
moonife 8 2009-11-28 13:54
8
0
我没看出什么 你这样写是做什么呢?
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
instruder 4 2009-11-28 13:59
9
0
就是一个堆栈本来的应是有数据的,但是现在变成了FFFFFFFF,可能有哪些原因呢,像这个提问的
mov  eax,_lpSEH
应该是:_lpSEH应该是指向一个结构的地址的

MOV EAX,DWORD PTR SS:[EBP+C](反汇编中的mov  eax,_lpSEH的表示)

但是DWORD PTR SS:[EBP+C]传递的却是FFFFFFFF

雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
笨l笨 2009-12-5 09:07
10
0
楼主太负责了,支持@@@
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子鱼 2009-12-9 10:43
11
0
感谢辛勤劳动的楼主
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
atmitnick 2009-12-11 03:44
12
0
[QUOTE=instruder;718857]就是一个堆栈本来的应是有数据的,但是现在变成了FFFFFFFF,可能有哪些原因呢,像这个提问的
mov  eax,_lpSEH
应该是:_lpSEH应该是指向一个结构的地址的

MOV EAX,DWORD PTR SS:[EBP+C](反汇编中的mov  eax,_lpSEH的表示)

...[/QUOTE]

你跟过头了吧,怎么变成值了。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
痞子陈 2009-12-12 13:41
13
0
感谢楼主,正在学习这一段
雪    币: 249
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
醉罪 2010-4-22 17:20
14
0
支持下 嘿嘿
雪    币: 249
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
醉罪 2010-4-22 18:42
15
0
纠正个错别字..P15
“在windows xp sp1之前,为了执行shellcode你可以直接跳到寄存器。但sp1和更搞版本系统 ”
是“更高”吧....
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
linquid 2010-4-27 13:59
16
0
从第三篇开始难度略微增加了
雪    币: 233
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
YagerM 1 2010-11-6 23:07
17
0
始终没弄明白为什么就刚好需要pop/pop/ret呢?有人能稍微详细的讲一下吗,文章里讲的比较少,-moonife兄的例子也调试了下,但是始终没搞懂为什么。
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
moonife 8 2010-11-7 00:23
18
0
pop  弹出Ntdll模块中调用SEH回调函数时压入的返回地址
pop 弹出SEH回调函数参数一:lpExceptionRecord
ret 把参数二lpSEH弹到EIP中 这个参数就是前面我们注册的EXCEPTION_REGISTRATION结构地址了

可以看下罗云彬的win32汇编的14章  讲得比较细的

; SEH Handler 异常处理程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Handler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
local @szBuffer[256]:byte

pushad
mov esi,_lpExceptionRecord
mov edi,_lpContext
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
invoke wsprintf,addr @szBuffer,addr szMsg,\
[edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlags
invoke MessageBox,NULL,addr @szBuffer,NULL,MB_OK
mov [edi].regEip,offset _SafePlace
assume esi:nothing,edi:nothing
popad
mov eax,ExceptionContinueExecution
ret

_Handler endp

; 在堆栈中构造一个 EXCEPTION_REGISTRATION 结构
;********************************************************************
assume fs:nothing
push offset _Handler
push fs:[0]
mov fs:[0],esp
雪    币: 389
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
wingdbg 2 2010-12-6 08:45
19
0
哪位大虾能提供一下Millenium MP3 Studio 1.0的安装文件啊,为了做学Expoit编写3,找遍了网络。都是2.0的版本。
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2010-12-6 13:06
20
0
雪    币: 219
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wufenjack 2010-12-15 15:55
21
0
请问谁研究教程三b后面的练习题了
http://www.corelan.be:8800/index.php/forum/writing-exploits/exploit-for-m3u-file-eip-overwrite-additional-excercise-of-tutorial-3-part-b/
好像给出了答案,但是没太分析明白,请大牛帮忙解答下?没看明白是覆盖EIP还是SEH法
雪    币: 219
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wufenjack 2010-12-15 16:17
22
0
刚刚又调了调,赶紧跟贴,呵呵
我用了2064个0x61填充(2064包含http://),运行没有异常,而是EIP直接被覆盖了,而刚才是用了大概2300个0x61填充就会报异常,这两个漏洞直接有联系吗?被整迷糊了,向大牛求解
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2010-12-15 17:33
23
0
具体要用多少个垃圾字符去填充,视你自己的系统环境而定,并不是像教程上面那样固定不变的,教程上面的exploit在中文的系统上很多情况下是不能用的,你得自己编写出属于自己系统的exploit。
雪    币: 219
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wufenjack 2010-12-16 16:05
24
0
嗯,后面的调试就是我自己填数据测试的,也写出exploit了!但是我如果再多填写一些数据就会出现跟教程3b一样的情况了,是覆盖SEH了。不知道这两种情况之间有没有啥联系?
雪    币: 129
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lwtpla 2010-12-16 16:06
25
0
我就纳闷了 我在SP3的环境下找到了溢出点SEH HANDLE 然后用POP POP RET地址填充,其中POP POP RET的地址是程序自带的xaudio.dll,而且还是用OD插件OllySSeh查找的。其它都是垃圾字节,但是断下来之后为什么 那个POP POP RET地址会被修改了呢??
游客
登录 | 注册 方可回帖
返回