3

私はexecveシェルコードを研究しようとしていますが、

OS:Linux bt 2.6.39.4

root@bt:~/exploit# cat gshell.s

.globl _start

_start:

    nop
    jmp MyString

    shell:

            popl %esi
            xorl %eax,%eax

            movl %al,9(%esi)
            movl %esi,10(%esi)
            movl %eax,14(%esi)

            movb $11,%al
            movl %esi, %ebx
            leal 0xa(%esi),%ecx
            leal 0xe(%esi),%edx
            int $0x80



            movl $1,%eax
            movl $0,%ebx
            int $0x80


    MyString:
            call shell
            shellvar:
                    .ascii "/bin/bashADDDDCCCC"

root@bt:~/exploit# as -gstabs -o gshell.o gshell.s

root@bt:~/exploit# ld -o gshell gshell.o

root@bt:~/exploit# ./gshell セグメンテーション違反 (コアダンプ) root@bt:~/exploit#

GDB:

(gdb) break *_start Breakpoint 1 at 0x8048054: ファイル gshell.s、6 行目。

(gdb) r プログラムの起動: /root/exploit/gshell

プログラム受信信号 SIGSEGV、セグメンテーション違反。shell () at gshell.s:14 14 movb %al,9(%esi)

(gdb) print /x $esi $1 = 0x804807a (gdb) x/16cb $esi 0x804807a : 47 '/' 98 'b' 105 'i' 110 'n' 47 '/' 98 'b' 97 'a' 115 's' 0x8048082 : 104 'h' 65 'A' 68 'D' 68 'D' 68 'D' 68 'D' 67 'C' 67 'C' (gdb)

上記の出力から、/bin/sh アドレスを ESI レジスタに正常に pope したようですが、0 を 9(%esi) に移動しようとすると、セグメンテーション違反が発生します。このプログラムを変更しようとさえしました: movl $0 から $esi. 0x804807a アドレスへの書き込みに制限されているかどうか知りたいですか? この障害の原因は何ですか?このシェルコードを正常に実行する方法

ありがとう、リトルジャック

4

1 に答える 1

4

Boがコメントで述べたように、この.textセクションは現在のシステムではデフォルトで読み取り専用です。このコードを機能させるには、書き込み可能にする必要があります。たとえば、次のようにソースファイルでディレクティブを使用できます。

.section wtext, "awx", @progbits

同等のnasmディレクティブは次のとおりです。

section wtext exec write

-Nまたは、スイッチをリンカーに渡すこともできます。

このようなシェルコードは通常、スタックの実行を目的としていることに注意してください。これは、現在のオペレーティングシステムでは通常無効になっているもう1つのことです。スタックでこれを試したい場合は、-z execstackリンカーオプションが必要になる場合があります。

于 2012-12-08T13:31:40.397 に答える