首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
简析Linux与FreeBSD的syscall
来源:http://www.unix5.com 作者:linux爱好者 发布时间:2008-04-28  

  虽然Linux的这个syscall会调用寄存器保存参数值,可能有其好处(最起码我感觉看代码和分析一些内核的时,

  舒服了很多:)),但是如果有些高人能够spoof寄存器,那么可能会引起一些麻烦,当然这样的麻烦还需要和特定的

  程序挂钩,不是说spoof就spoof成功的:)

  FreeBSD的就优良了很多,我不得不佩服FreeBSD的优点,开始的时候我也经常被FreeBSD这样的调用方式搞的头大

  的厉害,但是就这么看啊看的,反而习惯了.在之前的时候,一直是一段时间Linux,一段时间BSD;只有在最近交叉跟

  踪的时候,才发现上面这个自己感觉比较有意思的问题:)

  --]FreeBSD的程序比Linux的运行速度快?

  这个问题很难说,如果从上面的代码来看的话,少了这么多的汇编代码,说FreeBSD比Linux慢估计谁都不会相信的.

  当然我没有针对FreeBSD的系统架构与Linux的系统架构进行更深入的对比分析,所以也不敢枉自下如此不清晰的结

  论:)如果那位有兴趣,能不能在相同的硬件平台下,对这俩OS做下测试?

  再继续罗嗦一个问题,虽然FreeBSD比Linux少了些汇编代码,但是syscall的参数FreeBSD肯定也是获取的,只不过

  获取的方式比Linux更直接了一些:)

  --]FreeBSD与Linux的shellcode

  先废话一下,说到syscall如果不说些shellcode的故事,好像的确是少了那么一点点事情...So,我们来看看FreeBSD

  与Linux的shellcode.我书写了一些简单的shellcode,看到网上很多关于shellcode的中文教程都是拿GDB不断调试出

  来的,感觉好麻烦:(个人认为既然熟悉GDB调试技术,肯定熟悉汇编,也肯定熟悉syscall,不熟悉找下头文件看看不就得

  了...于是我一直用汇编来写这些可爱的shellcode,刚学会几天,不对的地方大家明示:)

  到底是先说FreeBSD的shellcode,还是先说Linux的呢?我拿硬币抛了下,至于为什么抛硬币...困了...找点刺激自己JNnLinux联盟
神经的方法:)).好了,硬币抛完了,先说FreeBSD下面的.

  编译:nasm -f elf ***.asm

  ld -s -o *** ***.o

  A: FreeBSD下面的shellcode(hello.asm):

  section .text

  global _start

  _start:

  xor eax,eax

  cdq

  push 0x0a216472

  push 0x6f57206f

  push 0x6c6c6548

  mov ebx,esp

  push byte 0xc

  push ebx

  push byte 0x1

  push eax

  mov al,0x4

  int 0x80

  xor eax,eax

  push eax

  mov al,0x1

  int 0x80

  ------------------------------------------------------------------------------------------------

  上面的的汇编代码可以直接编译来获取shellcode,按照前面说的编译办法编译,然后:

  objdump -D hello > hello.txt

  把获得的机器码copy出来就是一个freebsd下面的shellcode了.

  B: Linux下面的shellcode(hello.asm):

  global _start

  _start:

  xor eax,eax

  jmp short string

  code:

  pop esi

  push byte 15

  push esi

  push byte 1

  push eax

  int 0x80

  xor eax,eax

  push eax

  push eax

  mov al,1

  int 0x80

  string:

  call code

  db "Hello word!", 0x0a|Linux开源世纪

上面的的汇编代码可以直接编译来获取shellcode,按照前面说的编译办法编译,然后:

 

  objdump -D hello > hello.txt

  把获得的机器码copy出来就是一个linux下面的shellcode了.

  C: 为什么FreeBSD与Linux下面的shellcode不同?

  这个问题,我想留给大家先思考下,然后再看我的下文.如果你看了我的下文还是不了解的话...那么可能的情况

  是你根本还不会汇编和Unix类型的编程...还有一个情况是,你太笨了:(

  C-1: Linux的syscall的系统调用是如下的过程:

  高级语言调用系统函数|

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

  ->把syscall的参数赋给寄存器|

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

  ->int 0x80|

  ->返回|

  那么,我们的shellcode在push参数的时候,就比较随便一些了,因为在后面的系统级别的syscall又对参数进行了二

  次的赋值,赋值给各个寄存器,然后才调用syscall.

  C-2: FreeBSD的syscall系统调用是如下的过程:

  高级语言调用系统函数|

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

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

  ->int 0x80|

  看到没有,或者说前面的内容记忆起来了吧?freebsd的syscall调用是在进入系统syscall前就push进来的,所以我们的

  shellcode必须得把参数的值先push进来,而不是象linux那样的随意.

  --]总结

  其实,最后这部分关于shellcode的不同之处,真正要写的话,估计还得整整的一篇内容.但是...人是铁饭是钢,一顿不吃

  饿的慌.于是准备做下逃兵,先去添饱肚子,然后美美的睡一觉.顺便做个美梦,在梦中,偶的"老大"又开始欺负偶了...


共3页: 上一页 [1] [2] 3 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·如何在Linux内核中的实现SYN Coo
·Linux操作系统“警惕”内核汉化
·Linux系统内核漏洞分析
·Linux操作系统核心的汉字显示机
·如何利用异常表处理Linux内核态
·Linux下的中文显示和支持常见问
·深入学习LINUX内核之七(图文讲解
·Linux内核源代码学习概述
·深入学习LINUX内核之六(图文讲解
·深入学习LINUX内核之五(图文讲解
·深入学习LINUX内核之四(图文讲解
·深入学习LINUX内核之三(图文讲解

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!