-->

execve的shellcode的写作分段错误(execve shellcode writing s

2019-06-21 18:32发布

我想学习的execve的shellcode,

操作系统:Linux 2.6.39.4 BT

根@ BT:〜/#利用猫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"

根@ BT:〜/利用#作为-gstabs -o gshell.o gshell.s

根@ BT:〜/利用#LD -o gshell gshell.o

根@ BT:〜/利用#./gshell分段故障(核心转储)根@ BT:〜/利用#

GDB:

(GDB)断裂* _start断点1在0x8048054:文件gshell.s,线6。

(GDB)R启动程序:/根/利用/ gshell

计划接收信号SIGSEGV,分割过错。 壳()在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)

从上面的输出似乎我已经成功地pope'd / bin / sh的地址进入ESI寄存器但是,当我尝试移动到0 9(%ESI) - >它会导致分段错误。 甚至试图修改此程序:MOVL $ 0 $ ESI。 要知道,如果它被限制在0x804807a地址写? 这导致该故障? 以及如何我可以成功运行该的shellcode进行

谢谢,littlejack

Answer 1:

正如博在他的评论说,该.text部分是只读的默认情况下,在当前系统。 为了使此代码工作,你必须使其可写。 比如,你可以用一个指令,像这样在源文件中:

.section wtext, "awx", @progbits

等效nasm指令是:

section wtext exec write

另外,还可以通过-N开关接头。

需要注意的是这样的外壳代码通常用于执行堆栈,这是的是通常在当前操作系统中禁用的又一件事。 如果你想尝试这个堆栈上,你可能需要的-z execstack链接器选项。



文章来源: execve shellcode writing segmentation fault