黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 网管频道 >> *NIX网管 >> 正文
·完美空间提供500M免费AS04-10·企业安全之YY内网准入以04-09
·企业安全之意识与策略04-09·剑走偏锋:IIS漏洞利用04-09
·我来免费网提供100M免费04-09·1122mb.com提供20G超大免04-08
·映像劫持与反劫持技术04-07·让所有"暴力删除工具"无04-07
·入侵88red系统的详细过程04-07·Sql Injection脚本注入终04-07
·vbs+delphi 反弹后门生成04-07·飞讯网提供100MB免费PHP04-07
·突破SQL注入攻击时输入框04-04·结合内核和病毒技术的最04-04
·Real Player rmoc3260.d04-04·亿万网络今月最后为您提04-04
·php+mysql 5 sql inject04-03·Real Player rmoc3260.d04-03
·oblog文件下载漏洞04-03·免费啦提供1G-2G免费全能04-03
·完全解析网页后门和挂马04-02·一句话开3389(只测试过04-02
·萧萧免费空间网提供100M04-02·谷道免费空间网提供1G免04-01
·从本地入手解决双线路由03-31·sablog 1.6 多个跨站漏洞03-31
·富文本编辑器的跨站脚本03-31·Cookie注入是怎样产生的03-31
[推荐]简析Linux与FreeBSD的syscall与shellcode
      ★★★★

简析Linux与FreeBSD的syscall与shellcode

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-8-28 11:22:38

--]概述
又是一个不眠的夜晚,其实这篇文档是不应该发表的,因为保密的原则吧,但是我仔细
google了下,没有类似的文章,而且发表的这部分文档也不至于被认为是什么绝密资料,
但是我还是隐藏了很多发现的内核级别可能存在的问题:)单纯从汇编代码的结构来阐述
下linux与freebsd到底那个更好玩一些.或者说那个运行速度会更快一些:)
我想大家看完这个文档以后,或许会知道到底是Linux稳固?还是FreeBSD稳固?
在本文的最后部分,附加了shellcode的问题,但没有专门的论述.
备注:本文观点仅代表个人观点,如有不对的地方,欢迎大家指正:)以提高本人的水平.

--]编译调试
A:编译选项
Linux :gcc -gdwarf-2 ***.c -o ***
FreeBSD: cc -gdwarf-2 ***.c -o ***
为了调试方便,我使用了上面的选项.
--------------------------------------
对于一般书写shellcode的编译选项一般为:
Linux :gcc -static -o *** ***.c
FreeBSD: cc -static -o *** ***.c
B:调试工具
Linux/Unix下面的调试工具为GDB,但是GDB基于内核的调试有些力不从心,因为GDB的调试是
基于用户模式(User mode).
这里我使用了其它的调试工具,所以下面大家看到的调试代码比较特殊,在这里事先声明.

--]Linux的syscall跟踪
写过shellcode的人都知道syscall是写shellcode的必需品:)当然这种概念只在Linux/Unix
的OS下才存在.最近这段时间因为一个"小小的问题"对Linux内核与FreeBSD的内核级别进行了
跟踪和调试,然后发现一个蛮有意思的问题,自己感觉这个问题可能会与Linux下shellcode与
FreeBSD下shellcode的不同有关系,当然也和系统架构存在一些细微的关系.下面的内容是Linux
下面syscall的一些汇编代码.
在Linux下面,Application调用syscall的代码如下:
420D4330 55           PUSH     EBP                             |
420D4331 89E5         MOV       EBP,ESP                         |->堆栈框架
420D4333 83EC18       SUB       ESP,00000018                 |
420D4336 897DFC       MOV       dword ptr [EBP]-04,EDI   |
420D4339 8B4D0C       MOV       ECX,dword ptr [EBP]+0c   |
420D433C 8B7D08       MOV       EDI,dword ptr [EBP]+08   |->syscall参数
420D433F 8975F8       MOV       dword ptr [EBP]-08,ESI   |
420D4342 8B5510       MOV       EDX,dword ptr [EBP]+10   |
420D4345 895DF4       MOV       dword ptr [EBP]-0c,EBX
420D4348 E81014F4FF     CALL     near32 ptr 4201575d
420D434D 81C3835F0500   ADD       EBX,00055f83
420D4353 8D77FF       LEA       ESI,dword ptr [EDI]-01
420D4356 83FE02       CMP       ESI,00000002
420D4359 8D75F0       LEA       ESI,dword ptr [EBP]-10
420D435C 0F477514       CMOVA     ESI,dword ptr [EBP]+14  
420D4360 53           PUSH     EBX
420D4361 89FB         MOV       EBX,EDI    
420D4363 B81A000000     MOV       EAX,0000001c //system call   number value  
420D4368 CD80         INT       80                 //调用0x80
420D436A 5B           POP       EBX
420D436B 3D00F0FFFF     CMP       EAX,fffff000
420D4370 89C6         MOV       ESI,EAX
420D4372 760E         JBE       short ptr 420d4382
420D4374 F7DE         NEG       ESI
420D4376 E8C912F4FF     CALL     near32 ptr 42015644
420D437B 8930         MOV       dword ptr [EAX],ESI
420D437D BEFFFFFFFF     MOV       ESI,ffffffff
420D4382 85F6         TEST     ESI,ESI
420D4384 782A         JS       short ptr 420d43b0
420D4386 85FF         TEST     EDI,EDI
420D4388 7426         JE       short ptr 420d43b0
420D438A 83FF03       CMP       EDI,00000003
420D438D 7721         JA       short ptr 420d43b0
420D438F E8B012F4FF     CALL     near32 ptr 42015644
420D4394 C70000000000   MOV       dword ptr [EAX],00000000
420D439A 8B45F0       MOV       EAX,dword ptr [EBP]-10
420D439D 8B5DF4       MOV       EBX,dword ptr [EBP]-0c
420D43A0 8B75F8       MOV       ESI,dword ptr [EBP]-08
420D43A3 8B7DFC       MOV       EDI,dword ptr [EBP]-04
420D43A6 89EC         MOV       ESP,EBP
420D43A8 5D           POP       EBP
420D43A9 C3           RETN  
---------------------------------------------------------------------
为了简单分析,我们就看这里的代码:
420D4330 55           PUSH     EBP                             |
420D4331 89E5         MOV       EBP,ESP                         |->堆栈框架
420D4333 83EC18       SUB       ESP,00000018                 |
420D4336 897DFC       MOV       dword ptr [EBP]-04,EDI   |
420D4339 8B4D0C       MOV       ECX,dword ptr [EBP]+0c   |
420D433C 8B7D08       MOV       EDI,dword ptr [EBP]+08   |->syscall参数
420D433F 8975F8       MOV       dword ptr [EBP]-08,ESI   |
420D4342 8B5510       MOV       EDX,dword ptr [EBP]+10   |
420D4345 895DF4       MOV       dword ptr [EBP]-0c,EBX
420D4348 E81014F4FF     CALL     near32 ptr 4201575d
420D434D 81C3835F0500   ADD       EBX,00055f83
420D4353 8D77FF       LEA       ESI,dword ptr [EDI]-01
420D4356 83FE02       CMP       ESI,00000002
420D4359 8D75F0       LEA       ESI,dword ptr [EBP]-10
420D435C 0F477514       CMOVA     ESI,dword ptr [EBP]+14  
420D4360 53           PUSH     EBX
420D4361 89FB         MOV       EBX,EDI    
420D4363 B81A000000     MOV       EAX,0000001c //system call   number value  
420D4368 CD80         INT       80                 //调用0x80
----------------------------------------------------------------------
当然从上面的代码,我们只能看到Linux在更深的一层调用syscall的一个汇编代码过程,换句话
说,可能上面的这些代码都是废话:)OK,我们继续看下面的内容.

--]FreeBSD的syscall
FreeBSD下面的syscall我进行了两次跟进的操作才进入到内部,所以下面使用了两个过程来演示
代码,不过从下面的代码来看FreeBSD的短了很多很多:)
trace into one step:
28080D98: 31C0         XOR       EAX,EAX
28080D9A: 53           PUSH     EBX
28080D9B: E800000000     CALL     near32 ptr 28080da0
-------------------------------------------------------------------
trace into two step:
28080DA0: 5B           POP       EBX
28080DA1: 81C3AC980600   ADD       EBX,000698ac
28080DA7: 8B934C0A0000   MOV       EDX,dword ptr [EBX]+00000a4c
28080DAD: 8902         MOV       dword ptr [EDX],EAX
28080DAF: 5B           POP       EBX
28080DB0: 8D051A000000   LEA       EAX,dword ptr [0000001c]//system call number value
28080DB6: CD80         INT       80
28080DB8: 7201         JC       short ptr 28080dbb
28080DBA: C3           RETN
--------------------------------------------------------------------
从上面的代码来看,FreeBSD的syscall代码比Linux的短了很多很多,但是仅仅是短还是不够的,如果在看
这个文档前你熟悉破解技术 or 溢出技术 or Intel汇编语言.我想可能大家有这样的感觉,FreeBSD的调用
syscall的过程比Linux的要安全了很多很多,为什么这么说呢?请再返回仔细看上面的Linux/FreeBSD的汇
编代码:)下面我们也会大概的论证下,但仅仅是猜测而已:)

--]FreeBSD比Linux安全?
学过破解技术的朋友,都知道通过一些跳转指令来实现对于软件的破解,当然使用跳转指令可能仅仅对一些
简单的软件是有用处.突然发现我上面说的这句话是废话,和本文没有任何的关系,郁闷...看来脑袋里面装的
东西多也不是什么好事情:(
言归正传,我们来大体的分析下为什么说BSD比Linux要安全些!请看下面的代码:
Linux的syscall调用:
420D4336 897DFC       MOV       dword ptr [EBP]-04,EDI   |
420D4339 8B4D0C       MOV       ECX,dword ptr [EBP]+0c   |
420D433C 8B7D08       MOV       EDI,dword ptr [EBP]+08   |->syscall参数
420D433F 8975F8       MOV       dword ptr [EBP]-08,ESI   |
420D4342 8B5510       MOV       EDX,dword ptr [EBP]+10   |
-----------------------------------------------------------------------------
420D435C 0F477514       CMOVA     ESI,dword ptr [EBP]+14   |
420D4360 53           PUSH     EBX                             |->syscall参数
420D4361 89FB         MOV       EBX,EDI                         |
420D4363 B81A000000     MOV       EAX,0000001c //system call   number value  
420D4368 CD80         INT       80                 //调用0x80
-----------------------------------------------------------------------------
从上面的代码我们可以看到这样一种情况,这里我们假设调用系统函数write来写输出:)
write(filehandle, buf, buf_length)
其汇编代码的函数调用,基本如下:
push buf_length
push buf
push filehandle
call write
然后进入到write函数后,我们就知道Linux的syscall的一个完整过程如下:
高级语言调用系统函数|
  ->jump syscall(即系统对系统函数的标识)|
    ->把syscall的参数赋给寄存器|
    ->mov eax,0x**(及上面write函数针对syscall的数值)|
      ->int 0x80|
        ->返回|
基本过程如上所示,那么如果我们spoof(欺骗)这些传递参数的寄存器呢?假设spoof是成功的,
那么很容易就会把一些坏变量值传递到syscall的系统调用,紧接着系统内核可能在接收到一些
坏信息的时候,处理不当,导致系统出现异常或者系统发生溢出.当然这些仅仅是猜测,本文的很
多内容都是在猜测,至于答案嘛,可能永远都没有...:)

[1] [2] 下一页

文章录入:cainiaowang    责任编辑:cainiaowang 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
VIP 专 区
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886