「hello world」をコンソールに出力するだけのシェルコードはどうなるのだろう。脆弱性をテストするとき、エクスプロイトが機能するかどうかをテストするためのシェルコードがあると非常に便利だと思います。
さらに、Cからシェルコードを使用可能な形式(たとえば、バックスラッシュ+ 16進文字)でコンパイルする方法についての簡単な説明は、ペイロードに対して実行するシェルコードを簡単に生成できるように、すばらしいでしょう。
主な質問に関係なく、役立つ情報は大歓迎です!
シェルコードをすばやくダーティにしたい場合は、msfvenom
を使用します。何かを学び、ウィザードになりたい場合は、次のことをお勧めします。
1。ご使用のプラットフォーム用の小さなアセンブラプログラムを記述します。
NULLバイトが生成されないようにコーディングする必要があることがわかります。これは、XORおよびその他のトリックをクリエイティブに使用することで実現できます。
;hello.asm
[SECTION .text]
global _start
_start:
jmp short ender
starter:
xor eax, eax ;clean up the registers
xor ebx, ebx
xor edx, edx
xor ecx, ecx
mov al, 4 ;syscall write
mov bl, 1 ;stdout is 1
pop ecx ;get the address of the string from the stack
mov dl, 5 ;length of the string
int 0x80
xor eax, eax
mov al, 1 ;exit the shellcode
xor ebx,ebx
int 0x80
ender:
call starter ;put the address of the string on the stack
db 'hello'
2。objdump
を使用して、命令のオペコードを取得します:
hello: file format elf32-i386
Disassembly of section .text:
08048080 <_start>:
8048080: eb 19 jmp 804809b
08048082 <starter>:
8048082: 31 c0 xor %eax,%eax
8048084: 31 db xor %ebx,%ebx
8048086: 31 d2 xor %edx,%edx
8048088: 31 c9 xor %ecx,%ecx
804808a: b0 04 mov $0x4,%al
804808c: b3 01 mov $0x1,%bl
804808e: 59 pop %ecx
804808f: b2 05 mov $0x5,%dl
8048091: cd 80 int $0x80
8048093: 31 c0 xor %eax,%eax
8048095: b0 01 mov $0x1,%al
8048097: 31 db xor %ebx,%ebx
8048099: cd 80 int $0x80
0804809b <ender>:
804809b: e8 e2 ff ff ff call 8048082
80480a0: 68 65 6c 6c 6f Push $0x6f6c6c65
。シェルコードは次のようになります:
char code[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd"\
"\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";
4。利益
それはターゲットプラットフォームに依存しますが、人生を少し楽にするために、さまざまなタイプのペイロードを生成できるMetasploitのMSFvenomツールを検討することをお勧めします。 Offensive Securityのチュートリアルを参照してください