黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 网管频道 >> *NIX网管 >> 文章正文
[推荐]简析Linux与FreeBSD的syscall与shellcode
        ★★★★
简析Linux与FreeBSD的syscall与shellcode
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-8-28

 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
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的这个syscall会调用寄存器保存参数值,可能有其好处(最起码我感觉看代码和分析一些内核的时,
舒服了很多:))
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的呢?我拿硬币抛了下,至于为什么抛硬币...困了...找点刺激自己
神经的方法:)).好了,硬币抛完了,先说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
------------------------------------------------------------------------------------------------
上面的的汇编代码可以直接编译来获取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的不同之处,真正要写的话,估计还得整整的一篇内容.但是...人是铁饭是钢,一顿不吃
饿的慌.于是准备做下逃兵,先去添饱肚子,然后美美的睡一觉.顺便做个美梦,在梦中,偶的"老大"又开始欺负偶了...

上一页  [1] [2] 

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