我想了解一些小代码:
jg 0x00000047
dec esp
inc esi
add [ecx],eax
Run Code Online (Sandbox Code Playgroud)
eax的价值是什么?这些是程序的四个第一句话,我不知道是否有默认值,或者前面的句子是否为eax添加了一些内容.
我的操作系统是Linux,可执行文件是由gcc4.3从C源代码编译的(gcc file.c exec)
取决于平台,语言和/或调用约定.但是,在此之前的代码通常应该将EAX设置为某个值.EAX是那些经常被修改的寄存器之一,它通常不用于保存内容.
说明看起来有点随机.特别是,"dec esp"通常是一个巨大的禁忌,因为堆栈应该始终是双字对齐的.你确定这是实际代码吗?如果我正在向右翻译,则指令字节转换为"\ x7fELF",这告诉我这只是Linux程序的头字节,而不是实际的代码字节.
即使代码中没有明确列出目标,某些指令也会隐式更新寄存器。一些例子:
cpuid返回 eax、ebx、ecx 和 edx 中的值loop减少 ecxrep字符串指令更改 ecx、edi 和 esirdmsr更改 eax 和 edxmul并div更改 eax 和 edx还有很多其他的例子。
您不能仅通过查看代码中未列出 eax 就认为它没有更改。
即使假设您知道哪些寄存器受哪些指令影响,您对值有任何保证的唯一时间是:
在任何其他时间,您都不能对值做出假设。