【问题标题】:Reversing engineering snippet of assembly x86?逆向装配 x86 的工程片段?
【发布时间】:2015-06-29 04:46:29
【问题描述】:

我正在尝试将此汇编代码转换为 C sn-p。

movl $0, -4(%ebp) # 4
movl -4(%ebp), %eax
sall $2, %eax
addl 8(%ebp), %eax
movl (%eax), %eax
cmpl 12(%ebp), %eax
jg .L6 

.L6:
nop

这是我目前所拥有的,但我认为有问题。 “movl (%eax), eax”这行尤其让我感到困惑。

int local = 0;
if ((int*)((local << 2) + param1) > parameter2) {
   ; // do nothing
}

【问题讨论】:

标签: c assembly att


【解决方案1】:

您对movl %(eax), %eax 的解释是正确的,但对addl 8(%ebp), %eax 行的解释是错误的。正确的代码应该是这样的:

// parameter1 is an int* at 8(%ebp)
// parameter2 is an int at 12(%ebp)
int local = 0; // at -4(%ebp)
if (parameter1[local] > parameter2) {
   ; // nop
} else {
   // whatever is betwween jg and .L6
}

【讨论】:

  • 非常感谢,但为什么我对 addl 的解释是错误的?我以为只是说 eax = eax + param2
  • param1,而不是 param2。在您的 c 代码中,您有“+ 2”,这是错误的 - 它是“+ param1”。
  • 非常感谢您的帮助,但如果您不介意,您能解释一下为什么您知道它的参数 [local] 而不是我写的所有内容吗?
  • parameter1[local] 实际上与*(int*)((local &lt;&lt; 2) + parameter1) 完全相同(假设parameter1 是例如int)。您的代码缺少用于取消引用指针的初始 *,并且您的初始代码还具有文字编号 2 而不是 param1。此外,数组引用更有可能是代码中的原始内容,因为您在此处进行逆向工程。
猜你喜欢
  • 2012-03-25
  • 2017-03-25
  • 2012-08-26
  • 2015-08-11
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
相关资源
最近更新 更多