首页 > UniX技术

全面了解Linux与FreeBSD的syscall相同与不同!

时间:2009-04-15 17:57:37  作者:chinaitlab  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
  --]概述又是一个不眠的夜晚,其实这篇文档是不应该发表的,因为保密的原则吧,但是我仔细google了下,没有类似的文章,而且发表的这部分文档也不至于被认为是什么绝......

  言归正传,我们来大体的分析下为什么说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的系统调用,紧接着系统内核可能在接收到一些

  坏信息的时候,处理不当,导致系统出现异常或者系统发生溢出.当然这些仅仅是猜测,本文的很

  多内容都是在猜测,至于答案嘛,可能永远都没有...:)

  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  FreeBSD的syscall调用:

  28080D98: 31C0 XOR EAX,EAX

  28080D9A: 53 PUSH EBX

  28080D9B: E800000000 CALL near32 ptr 28080da0

  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

  从上面的代码我们也可以看到这样一种情况,这里我们假设调用系统函数write来写输出:)

  write(filehandle, buf, buf_length)

  其汇编代码的函数调用,基本如下:

  push buf_length

  push buf

  push filehandle

  call write

  然后进入到write函数后,我们就知道Linux的syscall的一个完整过程如下:

  高级语言调用系统函数|

  ->jump syscall(即系统对系统函数的标识)|

  ->mov eax,0x**(及上面write函数针对syscall的数值)|

  ->int 0x80|

  ->返回|

  根据我的跟踪分析,发现FreeBSD使用了程序里面的参数变量,这样的情况就是FreeBSD省去了一个寄存器调用

  函数参数的过程,这样就禁止了可能存在spoof寄存器的问题,从这点上来看,FreeBSD的确比Linux要安全很多.

如果您需转载 全面了解Linux与FreeBSD的syscall相同与不同!,请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门