首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >linux上的x86程序集,movsd分段故障

linux上的x86程序集,movsd分段故障
EN

Stack Overflow用户
提问于 2014-02-17 14:02:44
回答 1查看 884关注 0票数 0
代码语言:javascript
运行
复制
_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"

我试图编写一个外壳代码(jmp-调用-pop)来生成一个shell,但是我在movsd指令(分段错误)上遇到了一个问题。我不明白是怎么回事,我用ptr设置esi到字符串,所以movsd应该将4字节从esi移动到edi,对吗?但是为什么它是分段断层呢?

EN

回答 1

Stack Overflow用户

发布于 2014-02-17 15:39:35

movsd将4个字节从esi指向的内存移动到edi指向的内存。您还没有初始化edi,因此这是一个指向任意地址的存储;它发生在分段错误上也就不足为奇了。

英特尔的架构手册,第2卷(这些是免费下载,可以回答您所有的基本组装问题。下载它们,并熟悉在哪里找到东西,如果您要编写程序集):

将第二个操作数(源操作数)指定的字节、字或双字移到第一个操作数(目标操作数)指定的位置。源操作数和目标操作数都位于内存中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21831091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档