execve shellcode写入分段错误
我正在研究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:
(gdb)break * _start断点1在0x8048054:文件gshell.s,第6行。
(gdb)r启动程序:/ root / exploit / gshell
程序收到信号SIGSEGV,分段故障。 shell()在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 '''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
谢谢,嘿嘿
正如Bo在评论中所说的那样,当前系统默认情况下.text
段是只读的。 为了使这个代码有效,你必须使它可写。 例如,您可以在源文件中使用指令,如下所示:
.section wtext, "awx", @progbits
等效的nasm
指令是:
section wtext exec write
或者,也可以将-N
开关传递给链接器。
请注意,这样的shell代码通常用于堆栈执行,这是当前操作系统通常禁用的另一个功能。 如果你想在堆栈上试试这个,你可能需要-z execstack
链接器选项。