如何从机器码中删除NULL(00)?

时间:2010-12-08 20:14:43

标签: assembly shellcode

我需要知道如何从机器代码中删除null(00)。我用汇编语言编写代码。它运行成功。我需要没有NULL的输出

.data
  Bash:
      .asciz "/bin/hostname"
  Null1:
      .int 0
  AddrToBash:
      .int 0
  NULL2:
      .int 0

  .text
      .globl _start

_start:
       #execute routine

       xor  %eax,%eax
       movl $Bash, AddrToBash
       movl $11,%eax
       movl $Bash,%ebx
       movl $AddrToBash,%ecx
       movl $NULL2,%edx
       int  $0x80

       #exit routine


     Exit:
       movl $10,%ebx
       movl $1,%eax
       int $0x80 

以下输出

4000b0: 31 c0                   xor    %eax,%eax
  4000b2:   c7 04 25 f2 00 60 00    movl   $0x6000e0,0x6000f2
  4000b9:   e0 00 60 00 
  4000bd:   b8 0b 00 00 00          mov    $0xb,%eax
  4000c2:   bb e0 00 60 00          mov    $0x6000e0,%ebx
  4000c7:   b9 f2 00 60 00          mov    $0x6000f2,%ecx
  4000cc:   ba f6 00 60 00          mov    $0x6000f6,%edx
  4000d1:   cd 80                   int    $0x80

00000000004000d3 <Exit>:
  4000d3:   bb 0a 00 00 00          mov    $0xa,%ebx
  4000d8:   b8 01 00 00 00          mov    $0x1,%eax
  4000dd:   cd 80                   int    $0x80

如何删除00, 我做了更改,如eaxalbx到bl blahahahahahaha ......但不行 有人可以修改它.......

2 个答案:

答案 0 :(得分:3)

如果要避免shellcode中的NULL字节,则必须考虑很多事情。但是,大部分时间它都涉及用等效的指令替换指令。

例如,

mov $0, %eax

生成包含NULL字节的b8 00 00 00 00。用

替换它
xor %eax, %eax

在语义上是等效的,但却生成31 c0

有关编写shellcode的详细介绍,请阅读Smashing The Stack For Fun And Profit。本书Hacking: The Art of Exploitation包含一个关于避免shellcode中的NULL字节的部分(0x523)。

答案 1 :(得分:0)

因此,您希望使用不包含字节0的操作码。这仅用于创建带字符串的缓冲区溢出(例如:strcpy())。

要么你很好地学习汇编,那么你就会知道大多数常用指令的二进制编码,从而能够避免使用现有的工具:将原始代码编码为表示而不用0字节(例如:BCD,base64,甚至像010010010这样的ASCII字符串),并在其前面加上一个不包含零的特殊描述符。