在本程序集cmp指令中比较了哪两个值?

时间:2018-02-07 00:13:44

标签: assembly

我有一个难题,我必须对一个函数进行反向工程以破译正确的函数输入(为了进入下一个函数)。在调试时,我使用以下作为我的函数输入:

6 d 358

现在我正在逐步调试gdb调试器以查看输入是否正确。

在AT& T语法中运行gdb时,我会遇到以下cmp指令:

0x0040107b <+315>:   movzbl -0x19(%ebp),%eax
0x0040107f <+319>:   cmp    %al,-0x9(%ebp)
0x00401082 <+322>:   je     0x401089 <phase_3+329>

cmp指令理论上将我的一个输入(6d358)与%al进行比较。

我跑了:

(gdb) i r al
al             0x64     100

...发现%al的值 100

因此-0x9(%ebp)处的任何值都与 100 进行比较。但是,如何确定-0x9(%ebp)处存储的值?

我尝试使用以下命令查看%ebp处存储的十进制值/字符串值:

(gdb) i r ebp
ebp            0xbfffef58    0xbfffef58
(gdb) x/d 0xbfffef58
0xbfffef58:    -104
(gdb) x/s 0xbfffef58
0xbfffef58:    "\230\357\377\277\003\016@"

...但{i}}和-104都不是我输入函数的输入。

我假设\230\357\377\277\003\016@前缀指的是另一个地址来获取值。我想我需要使用其他寄存器值/地址来帮助我:

-0x9

任何有助于确定这个价值的帮助都会非常感激!

1 个答案:

答案 0 :(得分:0)

如上所述:

https://www.cs.uaf.edu/2015/fall/cs301/lecture/09_16_stack.html

  

al和ah是寄存器的8位“char”大小部分。

因此,%al指的是寄存器中的'char'。因此,此cmp语句正在比较2 char

让我们参考i r al命令的输出:

(gdb) i r al
al             0x64     100

要确定char的{​​{1}}值,我们需要获取提供的十六进制值并引用hex-to-ASCII chart。根据十六进制到ASCII图表,al的{​​{1}}十六进制值对应于char 0x64。嘿,这是我们的投入之一!

因此,我们知道我们将al的输入与d进行了比较。

要查找d的值,我们需要转到-0x9(%ebp)的内存地址,从该地址'值中减去-0x9(%ebp),最后取消引用那个地址。这是找到该值的命令:

%ebp

这给出了0x9(十进制)的输出,它是十六进制的(gdb) x/b $ebp-9 。再次参考hex-to-ASCII图表,发现118对应于char 0x76

总结:我们[{1}}的[错误]输入与0x76的[正确]输入进行了比较。

解决方案:我们对v的输入应更改为d