|
虽然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 下一页
|