0

シェル コードを作成するために、今日アセンブリを開始しました。ASM は問題なく、しばらくすると次のように作成されました。

[SECTION .text]

global _start


_start:

        call ender

        starter:
        mov al, 4
        mov bl, 1
        pop ecx
        mov dl, 21
        int 0x80

        xor eax, eax
        mov al, 1
        xor ebx,ebx
        int 0x80

        ender:
        call starter
        db 10,'Shellcode forever!',10 ,10

うまくいった:

Shellcode forever!

root@root:~/Desktop# clear;nasm -f elf test.asm;ld -s -o test test.o;./test

そこで、「objdump -d test」を使用して、次の結果を得ました。

test:     file format elf32-i386


Disassembly of section .text:

08048060 <.text>:
 8048060:   e8 11 00 00 00          call   0x8048076
 8048065:   b0 04                   mov    $0x4,%al
 8048067:   b3 01                   mov    $0x1,%bl
 8048069:   59                      pop    %ecx
 804806a:   b2 15                   mov    $0x15,%dl
 804806c:   cd 80                   int    $0x80
 804806e:   31 c0                   xor    %eax,%eax
 8048070:   b0 01                   mov    $0x1,%al
 8048072:   31 db                   xor    %ebx,%ebx
 8048074:   cd 80                   int    $0x80
 8048076:   e8 ea ff ff ff          call   0x8048065
 804807b:   0a 53 68                or     0x68(%ebx),%dl
 804807e:   65                      gs
 804807f:   6c                      insb   (%dx),%es:(%edi)
 8048080:   6c                      insb   (%dx),%es:(%edi)
 8048081:   63 6f 64                arpl   %bp,0x64(%edi)
 8048084:   65 20 66 6f             and    %ah,%gs:0x6f(%esi)
 8048088:   72 65                   jb     0x80480ef
 804808a:   76 65                   jbe    0x80480f1
 804808c:   72 21                   jb     0x80480af
 804808e:   0a 0a                   or     (%edx),%cl

しかし、それをシェルコードに変えたとき:

char code[] = "\xe8\x11\x00\x00\x00\xb0\x04\xb3\x01\x59\xb2\x15\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xea\xff\xff\xff\x0a\x53\x68\x65\x6c\x6c\x63\x6f\x64\x65\x20\x66\x6f\x72\x65\x76\x65\x72\x21\x0a\x0a";

うまくいきませんでした。何が間違っていますか?

4

1 に答える 1

1

これが問題です:

nasm -f elf test.asm

ELF はバイナリ形式であり、実行可能ファイルの生成には問題なく、スタンドアロン テストが機能する理由ですが、シェルコードはヘッダーやセクションなどの優れたものではなく、生の形式で提供されます。

上記の生のバイトを取得するには、次のように置き換えるだけelfですbin

nasm -f bin test.asm

これにより、指定したニーモニックを使用して生のオブジェクトが生成されます。私自身の生活を楽にするために、私は一般的に以下を含めます:

[bits 32]

また

[bits 64]

適切なアーキテクチャを取得するために、アセンブラ ファイルで。

ダイレクト バイナリ出力に変更すると、リンカが未加工のバイナリの塊ではなく、ELF 互換オブジェクトをリンクするため、実行可能リンクへのリンク テストが中断されます。これに対する回避策はありませんが、このコンパイル済みバージョンとバイナリ バージョンの両方を生成できない理由はありません。

Linux システムでは、私は通常、わざわざ直接リンクすることはせず、代わりに次のような小さなテスト リグを使用します。

#include <stdio.h>
#include <stdint.h>

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

#define PAGE_SIZE 4096U

uint8_t buffer[] = { 
    0xeb, 0x01, 0x90, ...
};

typedef int (* func)();

int main(int argc, char** argv)
{
    func f;
    mprotect((void*)((size_t)&buffer[0] & ~(PAGE_SIZE -1)), 
             2*PAGE_SIZE, PROT_READ | PROT_EXEC);
    f = (func) &buffer[0];
    f();
    return 0;
}

関連するコピー環境を紹介するなど、さまざまなケースに合わせて変更することがあります。使用を開始するには、次のようにコンパイルします。

gcc -z execstack -fno-stack-protector -std=gnu99 -o testshell testshell.c

これはexecstackバイナリで実行可能なスタックを有効にするために実行されます。これは現実的なターゲット環境ではありませんが、これテストであり、スタック プロテクターをオフにします。スタック プロテクターは再びターゲットに存在しますが、基本的な開発の邪魔になります。

于 2013-03-12T19:22:07.517 に答える