我正在尝试研究执行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
链接器选项。