c - 在汇编中解密二进制文件

标签 c assembly

我正在处理一项作业的一部分,该作业要求我确定将哪些参数传递给函数以跳过某个函数。这是有问题的汇编代码。

这是函数的开头,它将一个参数移入 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/

相关文章:

c - 将 int 转换为 size-t 是否可以避免数字溢出?

c - 数组函数只返回第一个元素,我需要整个数组。请帮助

c - 在 Linux 内核函数中的缓冲区中查找子字符串

c# - 非托管函数 Hook ,调用约定的堆栈/注册问题?

c - 删除行时文本文件中的特殊字符

使用 Eclipse 对 C 应用程序进行交叉编译

assembly - 在 x86 32 位中禁用分页

c - 让 gcc 以 "int 0x80"方式编译系统调用?

assembly - 可以在同一代码路径中混合传统 SSE 编码指令和 VEX 编码指令吗?

assembly - 美元 ($) 和百分号 (%) 在 x86 汇编中代表什么?