linux上的x86程序集,movsd SEGFULT
我试图编写一个外壳代码(jmp调用pop)来生成一个外壳,但是我在linux上的x86程序集,movsd SEGFULT,x86,segmentation-fault,shellcode,X86,Segmentation Fault,Shellcode,我试图编写一个外壳代码(jmp调用pop)来生成一个外壳,但是我在movsd指令(segfault)上遇到了一个问题。我不明白怎么回事,我用ptr设置esi到字符串,所以movsd应该从esi到edi移动4字节,对吗?但是为什么会出现分段故障呢?movsd将4个字节从esi指向的内存移动到edi指向的内存。您尚未初始化edi,因此这是一个任意地址的存储;这种情况发生在赛格弗拉特身上并不奇怪 英特尔体系结构手册第2卷(这些是免费下载的,可以回答您所有的基本汇编问题。下载它们,如果您要编写汇编,请熟
movsd
指令(segfault)上遇到了一个问题。我不明白怎么回事,我用ptr设置esi到字符串,所以movsd应该从esi到edi移动4字节,对吗?但是为什么会出现分段故障呢?movsd
将4个字节从esi
指向的内存移动到edi
指向的内存。您尚未初始化edi
,因此这是一个任意地址的存储;这种情况发生在赛格弗拉特身上并不奇怪
英特尔体系结构手册第2卷(这些是免费下载的,可以回答您所有的基本汇编问题。下载它们,如果您要编写汇编,请熟悉在何处查找内容):
移动用第二个操作数指定的字节、字或双字
(源操作数)到第一个操作数指定的位置
(目标操作数)源操作数和目标操作数都是
位于内存中。
leaedi[edx]
给我一个错误!但我正在用edx的地址初始化edi…对吗?没有“edx的地址””lea edi,[edx]
相当于mov edi,edx
,这没有帮助,因为edx
也未初始化。您最好花些时间熟悉x86汇编的基础知识。请告诉我是否正确:我无法将字符串的4字节直接保存到寄存器,对吗?我必须在.bss部分内使用缓冲区…还是不使用?如果您只想将esi
指向的内存放入寄存器,正确的方法是加载(例如mov-edx,[esi]
)。当然可以下载英特尔手册;阅读它们比尝试所有可能的指令组合要快得多=)
_start:
jmp short call
shell:
pop esi
movsd ;move 4 byte from esi to edi (/bin)
mov edx,edi ;edx contains /bin
xor edi,edi
movsw ;move 2 bytes (/s)
xor ebx,ebx
mov ebx,edi ;ebx contains /s
xor eax,eax
xor edi,edi
movsb
mov eax,edi ;eax contiene h
mov esi,edx ;esi contains /bin
xor ecx,ecx
push ecx
mov edx,esp ;edx dword NULL
push ecx ;NULL
push ecx ;NULL
add esp,3 ;0
push eax
add esp,3 ;h
push ebx
add esp,2 ;/s
push esi ;/bin
mov ecx,esp ;/bin/sh0,NULL
xor edi,edi
push edi
add esp,3 ;0
push eax
add esp,3
push ebx
add esp,2
push esi
mov ebx,esp ;/bin/bash0
xor eax,eax
mov al,0xb
int 0x80
call:
call shell
path db "/bin/sh"