设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> Linux专题 >> 内核研究 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
Fedora Core linux中设置…
Linux操作系统桌面应用大…
Linux端口扫描工具nmap …
Linux下的 podcast 软件
Linux的使用,学好这,走…
Linux 入门常用命令
Linux中用ALSA驱动声卡流…
关于Linux系统中调整刷新…
Linux查看磁盘分区等命令…
在Linux系统中批量添加用…
  简析Linux与FreeBSD的syscall         
简析Linux与FreeBSD的syscall
 

--]概述

  又是一个不眠的夜晚,其实这篇文档是不应该发表的,因为保密的原则吧,但是我仔细

  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
Linux联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-1-2 4:02:50
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持