-2

我需要知道如何从机器代码中删除 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,我做了更改,喜欢eax到bl blahahahahahaha ......但是不行,有人可以修改它...... albx

4

2 回答 2

6

如果你想在 shellcode 中避免 NULL 字节,你必须考虑很多事情。然而,大多数时候它涉及用等效的指令替换指令。

例如,

mov $0, %eax

产生b8 00 00 00 00其中包含 NULL 字节。将其替换为

xor %eax, %eax

在语义上是等价的,但是产生31 c0了。

有关编写 shellcode 的良好介绍,请阅读Smashing The Stack For Fun And ProfitHacking: The Art of Exploitation一书包含一节 (0x523) 关于避免 shellcode 中的 NULL 字节。

于 2012-04-24T07:39:38.470 回答
0

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

要么你学得很好,这样你就可以记住最常见指令的二进制编码,从而能够避免 0。或者通过使用现有的工具:将原始代码编码为没有 0 字节的表示的东西(例如:BCD、base64 甚至 ASCII 字符串(如010010010),并在其前面添加一个不包含零的特殊描述符。

于 2010-12-08T21:12:11.327 回答