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

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

2009-11-26 23:13
50158
收藏
免费 7
支持
分享
最新回复 (33)
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
2
我写了一个简单的例子来演示文章作者所使用的关键技术,
阅读本篇的朋友可以先用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
2009-11-26 23:17
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
3
还是perl 明了简单啊,编写exploit,perl当属精品!
2009-11-26 23:23
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
4
太速度了,俺得加油了。
2009-11-27 11:01
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习中呀,总觉得好难
2009-11-27 12:03
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
6
回复dge:你那篇是本专题的精华所在,也是内容最长的一篇,慢慢翻译,保证质量,呵呵…
2009-11-27 13:17
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
7
请教一个问题,这个是异常的过程
_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的热心翻译及帮助
2009-11-27 13:29
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
8
我没看出什么 你这样写是做什么呢?
2009-11-28 13:54
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
9
就是一个堆栈本来的应是有数据的,但是现在变成了FFFFFFFF,可能有哪些原因呢,像这个提问的
mov  eax,_lpSEH
应该是:_lpSEH应该是指向一个结构的地址的

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

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

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

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

...[/QUOTE]

你跟过头了吧,怎么变成值了。
2009-12-11 03:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢楼主,正在学习这一段
2009-12-12 13:41
0
雪    币: 249
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持下 嘿嘿
2010-4-22 17:20
0
雪    币: 249
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
纠正个错别字..P15
“在windows xp sp1之前,为了执行shellcode你可以直接跳到寄存器。但sp1和更搞版本系统 ”
是“更高”吧....
2010-4-22 18:42
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
从第三篇开始难度略微增加了
2010-4-27 13:59
0
雪    币: 233
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
始终没弄明白为什么就刚好需要pop/pop/ret呢?有人能稍微详细的讲一下吗,文章里讲的比较少,-moonife兄的例子也调试了下,但是始终没搞懂为什么。
2010-11-6 23:07
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
18
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
2010-11-7 00:23
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
19
哪位大虾能提供一下Millenium MP3 Studio 1.0的安装文件啊,为了做学Expoit编写3,找遍了网络。都是2.0的版本。
2010-12-6 08:45
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
20
2010-12-6 13:06
0
雪    币: 219
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
请问谁研究教程三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法
2010-12-15 15:55
0
雪    币: 219
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
刚刚又调了调,赶紧跟贴,呵呵
我用了2064个0x61填充(2064包含http://),运行没有异常,而是EIP直接被覆盖了,而刚才是用了大概2300个0x61填充就会报异常,这两个漏洞直接有联系吗?被整迷糊了,向大牛求解
2010-12-15 16:17
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
23
具体要用多少个垃圾字符去填充,视你自己的系统环境而定,并不是像教程上面那样固定不变的,教程上面的exploit在中文的系统上很多情况下是不能用的,你得自己编写出属于自己系统的exploit。
2010-12-15 17:33
0
雪    币: 219
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
嗯,后面的调试就是我自己填数据测试的,也写出exploit了!但是我如果再多填写一些数据就会出现跟教程3b一样的情况了,是覆盖SEH了。不知道这两种情况之间有没有啥联系?
2010-12-16 16:05
0
雪    币: 129
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我就纳闷了 我在SP3的环境下找到了溢出点SEH HANDLE 然后用POP POP RET地址填充,其中POP POP RET的地址是程序自带的xaudio.dll,而且还是用OD插件OllySSeh查找的。其它都是垃圾字节,但是断下来之后为什么 那个POP POP RET地址会被修改了呢??
2010-12-16 16:06
0
游客
登录 | 注册 方可回帖
返回
//