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 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

从上面的输出,似乎我已经成功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链接器选项。