小议shellcoder
作者:arhat.ptg@gmail.com
关键字:shellcoder shellcode hacker cracker

大家对hacker(黑客)、crack(骇客)可能不太陌生,但我相信有很多人还不太清楚shellcoder,要说起来,这个叫法最早见诸于《The ShellCoder’s Handbook》一书。英文词根“-er”加在单词的后面,是表示“…人”。顾名思义,我们可以把shellcoder理解为“编写shellcode的人”,或者“精通shellcode的人”,或“把shellcode玩弄于股掌之中的人”,不一而足。这里,焦点全集中在shellcode上了,因此,要想弄明白shellcoder,有必要先介绍一下shellcode。
Shellcode也不是真正意义上的单词,在各大词典中还罕见它的身影。shellcode是由shell + code两个单词合成而来,意思是“运行shell的代码”、“开一个shell的代码”等等。问题的焦点从而又转移到shell上来了,看来真是要打破沙锅了。这里的shell最初是指类Unix系统(包括Unix系列,BSD系列,Linux系列,等等)上运行的命令解释程序,其实现有bash,ksh,sh等。具体的技术问题就不多讲了,言归正传,通过上面的介绍,我们大概了解了shellcode的含义――就是一段在类Unix系统上运行的代码,运行后可以打开一个shell。那shellcode的作用是什么呢?
毛主席说过:没有无缘无故的爱,也没有无缘无故的恨。那么shellcode的出现必然有其意义,而且对那些搞安全的人,可以说是意义非凡。大家对臭名昭著的缓冲区(栈、堆)溢出可能并不陌生,要想利用这些溢出(漏洞),必须要有利用代码(攻击代码),对应的英文是exploit,或简称为exp。而exploit的核心就是shellcode,如果说exploit是核弹,那么shellcode就是核弹头,它的重要性与核心作用就不用多强调了吧。
Shellcode通常是一段操作指令(opcode),可以在被攻击的程序内运行。因为shellcode需要直接操作寄存器和函数,所以opcode必须以十六进制的形式出现。它最初的用处是――派生root shell(什么root shell?,就是以root权限运行的shell。要详细解释派生root shell,还要牵扯到Unix下带s位程序的问题,等等。因此,就不进一步阐述了)。当然,这只是shellcode最普通的用法,现在,经过程序员精心设计的shellcode可以完成很多复杂的任务。
Shellcode面临的环境各式各样,所要完成的任务又因人而异,因此,编写shellcode,特别是一个短小精悍的shellcode是一件非常难的事情,需要很高的编程技巧。它就像一件精心雕琢的艺术品,恰到好处,多一个字节都不行。所以shellcoder,也就是编写shellcode的人,都是传说中高手;而那些能编写变形、加密、反弹、跨平台的复合型shellcode的人都是高手中的传说。
近几年,涉及到shellcode的书出了不少,但专注于shellcode的书只有两本,一本是我极为推崇的《The ShellCoder’s Handbook:Discovering and Exploiting Security》,另一本是《Shellcoder’s programming uncovered》。第一本书的6位作者都是工作在第一线的大牛,具有丰富的实战经验,发现了众多的安全漏洞,技术十分了得。第二本书的作者KrisKaspersky――是一位多产的作者,专注于信息安全,已经出过多本有关信息安全的书,虽然严格说来他的书算不上精品,但其中也不乏真知灼见。
既然谈到了shellcoder,我想借此机会谈一谈我心目中的hacker,cracker。每个人所处的环境,看问题的角度都不尽相同,因此,对同一事物可能会有不同的看法。我在此叙述的只是我的看法,不值得的争论,但欢迎大家指正、指教。
Hacker在令我尊敬的、正面的形象。我认为黑客是指那些富有钻研、创新、永不满足精神的人,他们可能会打破一个旧世界,更会创造一个新世界。从狭义上讲,他们在信息安全领域里的革命者,不断改进完善程序的功能,增进程序的性能,挖掘机器的潜力。从广义上讲,任何领域的创新者,那些不满足于现状,孜孜不倦进行探索的人也是黑客。大众媒体宣传的黑客,在我的心目中只是一些利用现有工具的人,他们是攻击者,是破坏者。当然此黑客与彼黑客并没有明显的界限,他们只是一种角色,而一个人在不同的时期可能会扮演不同的角色,或者在同一时期扮演不同的角色。
Cracker,破解者,也称搞破解的(人),他们主要是解除程序中各种保护措施,使大众可以免费使用这些软件。他们的对与错我无从评价,但他们为软件免费走进千家万户所做的努力却是有目共睹。以卫道士面目出现的媒体总是谴责cracker,说他们破坏软件业的秩序,牟取私利;也有些媒体把它翻译为“骇客”,指搞破坏的攻击者,主要是为了和所谓的“黑客”区分开来。
就像我前面所说的,每个人可能扮演不同的角色,那么shellcoder、hacker、cracker的界限也就不那么明显了。(在人云亦云占据主流的今天,你还在坚守心中那片净土吗?)

附录:
为了让大家有一个感性认识,下面列一段汇编代码,以及它对应的shellcode:

汇编代码:
Section    .text
    global _start   
_start:       
    jmp short       GotoCall   
shellcode:   
     pop             esi               
     xor             eax, eax          
     mov byte        [esi + 7], al     
     lea             ebx, [esi]        
     mov long        [esi + 8], ebx    
     mov long        [esi + 12], eax   
     mov byte        al, 0x0b          
     mov             ebx, esi          
     lea             ecx, [esi + 8]    
     lea             edx, [esi + 12]   
     int             0x80   
GotoCall:   
     Call             shellcode
     db              '/bin/shJAAAAKKKK'

对应的shellcode:
char shellcode[] =
        "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
        "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
        "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
注:以上代码来自《The ShellCoder’s Handbook》。