问题描述
我开始学习阅读操作码,并且发现了这一点:
89 75 95 movl %esi,var_6ch
var_6ch
在ebp-0x6c
处
89 75 95
的哪个部分表示“地址” ebp-0x6c
?我在互联网上发现89
是movl的代码,也许75是注册esi的代码?或者可能是2个字节对这2条信息进行编码。
解决方法
您有一个错字,是“ moves%esi,-0x6b(%ebp)”。 0x95是0x100-0x6b;那是-0x6b的二进制编码。
我通过制作一个简单的文件y.s并输入:
movl %esi,-0x6c(%ebp)
编译为32位(cc -m32)。然后,使用otool(如果您使用的是Linux,则为macos,objdump)转储文本部分:otool -t;然后我又添加了几行:
movl %esi,-0x6b(%ebp)
movl %esi,-1(%ebp)
产生了:
Contents of (__TEXT,__text) section
00000000 89 75 94 89 75 95 89 75 ff
使内容非常明显。接下来,尝试将%ebp替换为%esp,%eax,然后将%esi替换为%edi,%edx等...或阅读手册。