首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在x86程序集中销毁标签

在x86程序集中销毁标签
EN

Stack Overflow用户
提问于 2009-08-18 21:06:35
回答 3查看 10K关注 0票数 7

考虑一下这个x86程序集代码:

代码语言:javascript
运行
复制
section .data

foo:
    mov ebx, [boo]
    mov [goo], ebx
goo:
    mov eax, 2
    mov eax, 3
    ret
boo:
    mov eax, 4
    mov eax, 5
    ret

这到底是怎么回事?当我取消[boo]mov[goo]的引用时,我到底要搬到那里吗?只有一个命令?ret也是吗?

跟进问题:

  1. ,取消引用标签给我地址了吗?或者标签中第一个命令的机器代码?如果是机器代码,则为
  2. --它怎么可能是多个命令?不是所有命令本质上都是32位(即使不是所有位都被使用)吗?
  3. 的底线-- eax的结尾值是3还是5?
EN

Stack Overflow用户

发布于 2009-08-18 21:10:40

第一个mov是相对于段寄存器eDS从偏移量goo复制的。第二个mov将foo的偏移量写入相对于DS寄存器的数据位置。如果CS和DS是巧合的,那么这是可以忽略的。假设CS和DS是巧合的,那么接下来您可能会遇到各种保护机制,使代码部分成为只读的。

关于后续行动:

  1. A标签不像引用--你不会因此而取消引用。汇编程序替换一个数字,表示结果代码中的位置。您可以在地址加载地址,也可以在地址加载东西。和指示取消引用-我已经修复了一个令人困惑的元素,在我的第一个反应,以涵盖这一点。
  2. 是一个像x86这样的指令集,具有非常可变的长度指令,有些甚至不是单词长度的倍数。
  3. 3--你只需要修改mov eax, 2的前4个字节(由于小的endian编码确实被替换为4,然后被完全没有修改的下一条指令覆盖-5从来没有作为候选人出现在图片中(我以为你认为代码被重新排序的方式与你第一次向question1询问的方式一样-尽管你很清楚,正如我应该从你的代表那里猜到的那样))。

请注意,所有这些假设CS = DS和DEP没有介入。

另外,如果您使用的是BX而不是EBX,那么您所期望的东西就会起作用(使用xX而不是ExX访问寄存器的低2字节,xL访问最低字节)

请记住,汇编程序纯粹是编写操作码的工具--比如标签之类的东西,都可以归结为数字等,几乎没有什么神奇的或令人印象深刻的代码转换--没有闭包或隐藏在其中的任何深层次的东西。(这有点过于简化了--代码可以重新定位,而且在许多情况下,通过链接器和加载程序的组合将补丁应用到偏移的使用中)

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1296515

复制
相关文章

相似问题

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