-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 を削除する方法、私は変更のようeaxalbxbl blahahahahahaha に変更しました......しかし、動作しません。

4

2 に答える 2

6

シェルコードで NULL バイトを回避したい場合は、多くのことを考慮する必要があります。ただし、ほとんどの場合、命令を同等のものに置き換える必要があります。

例えば、

mov $0, %eax

b8 00 00 00 00NULL バイトを含むものを生成します。それを置き換える

xor %eax, %eax

意味的には同等ですが、31 c0代わりに生成されます。

シェルコードの書き方については、Smashing The Stack For Fun And Profitを読んでください。本Hacking: The Art of Exploitationには、シェルコードでの NULL バイトの回避に関するセクション (0x523) が含まれています。

于 2012-04-24T07:39:38.470 に答える
0

したがって、バイト 0 を含まないオペコードを使用する必要があります。これは、文字列でバッファ オーバーフローを作成する場合にのみ役立ちます (例: strcpy())。

アセンブリをよく学んで、最も一般的な命令のバイナリ エンコーディングを暗記し、0 を回避できるようにするか、既存のツールを使用して、元のコードを 0 バイトのない表現にエンコードするもの (例: BCD、base64、または010010010) のような ASCII 文字列でさえ、ゼロを含まない特別な記述子を先頭に追加します。

于 2010-12-08T21:12:11.327 に答える