linux上的x86程序集,movsd SEGFULT

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卷(这些是免费下载的,可以回答您所有的基本汇编问题。下载它们,如果您要编写汇编,请熟

我试图编写一个外壳代码(jmp调用pop)来生成一个外壳,但是我在
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"