我正在处理一项作业的一部分,该作业要求我确定将哪些参数传递给函数以跳过某个函数。这是有问题的汇编代码。
这是函数的开头,它将一个参数移入 eax 并执行算术运算:
0x080499ca <+0>: push %ebp
0x080499cb <+1>: mov %esp,%ebp
0x080499cd <+3>: sub $0x8,%esp
0x080499d0 <+6>: mov 0x8(%ebp),%eax
0x080499d3 <+9>: sub $0x37,%eax // subtract 55
0x080499d6 <+12>: cmp $0x13,%eax // compare against 19
0x080499d9 <+15>: ja 0x8049a4a <transform+128>
首先,movzbl 函数将 0x804 的值(并用零扩展它)...移动到寄存器中。其二进制值为:001000000001001101001000111000
“xor”将其与常量 1 进行比较。测试采用 eax(寄存器)的最低 8 位和新值:
0x08049a4a <+128>: movzbl 0x804d238,%eax
0x08049a51 <+135>: xor $0x1,%eax
0x08049a54 <+138>: test %al,%al
0x08049a56 <+140>: je 0x8049a5d <transform+147>
如果设置了 ZFLAG,则它会跳转(这就是我想要的)。不过,我不确定为什么每次使用相同的值时,根据我传递给整个函数的参数,该标志会有所不同。似乎每次都应该提供相同的结果。为什么有时会设置标志,有时不会设置标志?
此外,我可以在参数中输入什么值以确保它跳转?
最佳答案
所以...
0x08049a4a <+128>: movzbl 0x804d238,%eax
0x08049a51 <+135>: xor $0x1,%eax
0x08049a54 <+138>: test %al,%al
0x08049a56 <+140>: je 0x8049a5d <transform+147>
...xor $0x01
翻转加载到 %eax
中的值的第 0 位; test %al, %al
和 %al
与其自身(丢弃结果,但保留对标志的影响);因此,如果 %al
为零,则将采用 je
。也就是说...如果 ((value ^ 1) & 0xFF) == 0
则跳转。
关于c - 在汇编中解密二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25032286/