linux上的x86程序集,movsd segfault

时间:2014-02-17 14:02:44

标签: x86 segmentation-fault shellcode

_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-call-pop)来生成一个shell,但我在movsd指令(segfault)上遇到了问题。我不明白有什么问题,我设置esi与ptr到字符串所以movsd应该从esi移动4个字节到edi对吗?但为什么它是segfaulting?

1 个答案:

答案 0 :(得分:2)

movsdesi指向的内存中的4个字节移动到edi指向的内存。您尚未初始化edi,因此这是一个存储到任意地址;它发生在段错误中并不奇怪。

英特尔架构手册,第2卷(这些是免费下载的,可以回答所有基本的汇编问题。如果您要编写汇编,请下载并熟悉查找内容的位置):

  

移动用第二个操作数指定的字节,字或双字   (源操作数)到第一个操作数指定的位置   (目的地操作数)。 源操作数和目标操作数都是   位于记忆中。