考虑一下这个x86程序集代码:
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也是吗?
跟进问题:
eax的结尾值是3还是5?发布于 2009-08-18 21:18:13
boo是mov eax, 3在节.data中的偏移量。mov ebx, [boo]的意思是“在boo在ebx中指示的偏移量处获取四个字节”。同样,mov [goo], ebx将在goo指示的偏移量处移动ebx的内容。
然而,代码通常是只读的,所以看到代码崩溃也就不足为奇了。
下面是boo中的指令是如何编码的:
boo:
b8 03 00 00 00 mov eax,0x3
c3 ret所以你在ebx中得到的实际上是mov eax, 3指令的4/5。
发布于 2009-08-18 21:10:40
第一个mov是相对于段寄存器eDS从偏移量goo复制的。第二个mov将foo的偏移量写入相对于DS寄存器的数据位置。如果CS和DS是巧合的,那么这是可以忽略的。假设CS和DS是巧合的,那么接下来您可能会遇到各种保护机制,使代码部分成为只读的。
关于后续行动:
mov eax, 2的前4个字节(由于小的endian编码确实被替换为4,然后被完全没有修改的下一条指令覆盖-5从来没有作为候选人出现在图片中(我以为你认为代码被重新排序的方式与你第一次向question1询问的方式一样-尽管你很清楚,正如我应该从你的代表那里猜到的那样))。请注意,所有这些假设CS = DS和DEP没有介入。
另外,如果您使用的是BX而不是EBX,那么您所期望的东西就会起作用(使用xX而不是ExX访问寄存器的低2字节,xL访问最低字节)
请记住,汇编程序纯粹是编写操作码的工具--比如标签之类的东西,都可以归结为数字等,几乎没有什么神奇的或令人印象深刻的代码转换--没有闭包或隐藏在其中的任何深层次的东西。(这有点过于简化了--代码可以重新定位,而且在许多情况下,通过链接器和加载程序的组合将补丁应用到偏移的使用中)
发布于 2009-08-18 21:45:44
后续答复:
,
之间。
https://stackoverflow.com/questions/1296515
复制相似问题