简析Linux与FreeBSD的syscall与shellcode
又是一个不眠的夜晚,其实这篇文档是不应该发表的,因为保密的原则吧,但是我仔细
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的调试是
基于用户模式(Usermode).
这里我使用了其它的调试工具,所以下面大家看到的调试代码比较特殊,在这里事先声明.
--]Linux的syscall跟踪
写过shellcode的人都知道syscall是写shellcode的必需品:)当然这种概念只在Linux/Unix
的OS下才存在.最近这段时间因为一个"小小的问题"对Linux内核与FreeBSD的内核级别进行了
跟踪和调试,然后发现一个蛮有意思的问题,自己感觉这个问题可能会与Linux下shellcode与
FreeBSD下shellcode的不同有关系,当然也和系统架构存在一些细微的关系.下面的内容是Linux
下面syscall的一些汇编代码.
在Linux下面,Application调用syscall的代码如下:
420D433055PUSHEBP|
420D433189E5MOVEBP,ESP|->堆栈框架
420D433383EC18SUBESP,00000018|
420D4336897DFCMOVdwordptr[EBP]-04,EDI|
420D43398B4D0CMOVECX,dwordptr[EBP]+0c|
420D433C8B7D08MOVEDI,dwordptr[EBP]+08|->syscall参数
420D433F8975F8MOVdwordptr[EBP]-08,ESI|
420D43428B5510MOVEDX,dwordptr[EBP]+10|
420D4345895DF4MOVdwordptr[EBP]-0c,EBX
420D4348E81014F4FFCALLnear32ptr4201575d
420D434D81C3835F0500ADDEBX,00055f83
420D43538D77FFLEAESI,dwordptr[EDI]-01
420D435683FE02CMPESI,00000002
420D43598D75F0LEAESI,dwordptr[EBP]-10
420D435C0F477514CMOVAESI,dwordptr[EBP]+14
420D436053PUSHEBX
420D436189FBMOVEBX,EDI
420D4363B81A000000MOVEAX,0000001c//systemcallnumbervalue
420D4368CD80INT80//调用0x80
420D436A5BPOPEBX
420D436B3D00F0FFFFCMPEAX,fffff000
420D437089C6MOVESI,EAX
420D4372760EJBEshortptr420d4382
420D4374F7DENEGESI
420D4376E8C912F4FFCALLnear32ptr42015644
420D437B8930MOVdwordptr[EAX],ESI
420D437DBEFFFFFFFFMOVESI,ffffffff
420D438285F6TESTESI,ESI
420D4384782AJSshortptr420d43b0
420D438685FFTESTEDI,EDI
420D43887426JEshortptr420d43b0
420D438A83FF03CMPEDI,00000003
420D438D7721JAshortptr420d43b0
420D438FE8B012F4FFCALLnear32ptr42015644
420D4394C70000000000MOVdwordptr[EAX],00000000
420D439A8B45F0MOVEAX,dwordptr[EBP]-10
420D439D8B5DF4MOVEBX,dwordptr[EBP]-0c
420D43A08B75F8MOVESI,dwordptr[EBP]-08
420D43A38B7DFCMOVEDI,dwordptr[EBP]-04
420D43A689ECMOVESP,EBP
420D43A85DPOPEBP
420D43A9C3RETN
---------------------------------------------------------------------
为了简单分析,我们就看这里的代码:
420D433055PUSHEBP|
420D433189E5MOVEBP,ESP|->堆栈框架
420D433383EC18SUBESP,00000018|
420D4336897DFCMOVdwordptr[EBP]-04,EDI|
420D43398B4D0CMOVECX,dwordptr[EBP]+0c|
420D433C8B7D08MOVEDI,dwordptr[EBP]+08|->syscall参数
420D433F8975F8MOVdwordptr[EBP]-08,ESI|
420D43428B5510MOVEDX,dwordptr[EBP]+10|
420D4345895DF4MOVdwordptr[EBP]-0c,EBX
420D4348E81014F4FFCALLnear32ptr4201575d
420D434D81C3835F0500ADDEBX,00055f83
420D43538D77FFLEAESI,dwordptr[EDI]-01
420D435683FE02CMPESI,00000002
420D43598D75F0LEAESI,dwordptr[EBP]-10
420D435C0F477514CMOVAESI,dwordptr[EBP]+14
420D436053PUSHEBX
420D436189FBMOVEBX,EDI
420D4363B81A000000MOVEAX,0000001c//systemcallnumbervalue
420D4368CD80INT80//调用0x80
----------------------------------------------------------------------
当然从上面的代码,我们只能看到Linux在更深的一层调用syscall的一个汇编代码过程,换句话说,可能上面的这些代码都是废话:)OK,我们继续看下面的内容. |
|