x86汇编,MOVSD段错误
问题描述:
_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"
我试图写生成一个壳的shellcode(JMP-呼叫流行),但我对movsd
指令(段错误)有问题。我不明白什么是错误的,我设置ESP的字符串,所以movsd应该从esi移动4字节到EDI的权利?但是,为什么它是segfaulting?x86汇编,MOVSD段错误
答
movsd
将4个字节从esi
指向的内存移动到edi
指向的内存。你还没有初始化edi
,所以这是一个存储到任意地址;它发生段错误并不奇怪。
英特尔架构手册,第2卷(这是免费下载,可以回答你所有的基本组件的问题下载他们和在哪里可以找到的东西,如果你要来编写汇编熟悉。):
将第二个操作数 (源操作数)指定的字节,字或双字移动到第一个操作数 (目标操作数)指定的位置。 位于内存中的源操作数和目标操作数都是 。
'lea edi,[edx]'给我段错误!但是我正在用edx的地址初始化edi ...我是对的吗? – polslinux
没有“edx'的地址”; 'lea edi,[edx]'相当于'mov edi,edx',这并没有帮助,因为edx'也是未初始化的。如果您需要一些时间来熟悉x86汇编的基础知识,您最好花点时间。 –
告诉我,如果我是正确的:我不能将4字节的字符串直接保存到寄存器右边?我必须在.bss部分中使用缓冲区...或不是? – polslinux