3

我正在尝试研究 execve shellcode,

操作系统: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) 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) 打印 /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 寄存器但是当我尝试将 0 移动到 9(%esi) --> 它会导致分段错误。甚至试图修改这个程序:movl $0 to $esi。想知道是否限制在 0x804807a 地址写入?哪个导致这个故障?以及如何继续成功运行这个 shellcode

谢谢,小杰克

4

1 回答 1

4

正如 Bo 在他的评论中所说,该.text部分在当前系统上默认为只读。要使此代码正常工作,您必须使其可写。例如,您可以在源文件中使用指令,如下所示:

.section wtext, "awx", @progbits

等效nasm指令是:

section wtext exec write

或者,也可以将-N开关传递给链接器。

请注意,此类 shell 代码通常用于堆栈执行,这是当前操作系统中通常禁用的另一件事。如果您想在堆栈上尝试此操作,您可能需要-z execstack链接器选项。

于 2012-12-08T13:31:40.397 回答