执行shell代码编写分段错误



我正在尝试研究执行shell代码,

操作系统:Linux bt 2.6.39.4

root@bt:~/利用#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:~/利用#作为-gstabs-o gshell.o gshell.s

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

root@bt:~/利用#/gshell分段故障(堆芯倾倒)root@bt:~/利用#

GDB:

(gdb)中断*_start0x8048054处的断点1:文件gshell.s,第6行。

(gdb)r启动程序:/root/provere/gshell

程序接收到信号SIGSEGV,分段故障。shell()位于gshell。时间:1414 movb%al,9(%esi)

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

从上面的输出来看,我似乎已经成功地将'd/bin/sh地址放入ESI寄存器但当我尝试将0移动到9(%esi)-->时,会导致分段错误。甚至试图修改这个程序:movl$0到$esi。想知道是否限制在0x804807a地址写入?是什么导致了这个故障?以及我如何成功运行这个外壳代码

谢谢,小插孔

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

.section wtext, "awx", @progbits

等效的nasm指令是:

section wtext exec write

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

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

相关内容

  • 没有找到相关文章

最新更新