【问题标题】:What 2 values are being compared in this Assembly cmp instruction?在这个汇编 cmp 指令中比较了哪两个值?
【发布时间】:2018-02-07 00:13:43
【问题描述】:

我有一个难题,我必须对函数进行逆向工程以破译正确的函数输入是什么(以便继续执行下一个函数)。在调试时,我使用以下作为我的函数输入:

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@"

...但是-104\230\357\377\277\003\016@ 都不是我输入到函数中的输入。

我假设-0x9 前缀是指另一个地址来获取值。我想我需要使用其他寄存器值/地址来帮助我:

(gdb) i r
eax            0x64    100
ecx            0xbfffea00    -1073747456
edx            0xbfffef40    -1073746112
ebx            0x405000    4214784
esp            0xbfffef30    0xbfffef30
ebp            0xbfffef58    0xbfffef58
esi            0xbfffefb0    -1073746000
edi            0xb7fb8000    -1208254464
eip            0x401084    0x401084 <phase_3+324>
eflags         0x206    [ PF IF ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

任何帮助弄清楚这个值是什么将不胜感激!

【问题讨论】:

  • 试试x/b $ebp-9
  • x/b $ebp-9 给了我0xbfffef4f: 118...嗯。那么118 是与 100 进行比较的值吗?我想知道这是从哪里来的:/
  • 不是\230 八进制的第一个字节吗? IE。 56?这是 char '8' 的 ASCII 码。 (编辑:可能不是,不确定应该如何解释 \230)。 118'v'。好吧,ebp 通常用于指向堆栈,所以使用x 命令在一开始就打印更大的未来堆栈区域,并继续打印它(或使用 gdb 上的一些 GUI)来跟踪更改。 ..
  • 你觉得v有什么意义吗?所以你建议我在调试器中不断运行x/b $ebp?希望%ebp 最初是我的投入之一?
  • $ebp 是帧指针。在任何情况下,都不需要猜测。代码应该很清楚地告诉你输入在哪里。

标签: assembly


【解决方案1】:

如此处所述:

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

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

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

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

(gdb) i r al
al             0x64     100

要确定alchar 值,我们需要采用提供的十六进制值并引用hex-to-ASCII chart。在我们的例子中,al0x64 十六进制值,根据十六进制到 ASCII 图表,对应于字符 d。嘿,这是我们的输入之一!

所以,我们知道我们的输入 d 正在与 -0x9(%ebp) 进行比较。

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

(gdb) x/b $ebp-9

这给出了118(十进制)的输出,即十六进制的0x76。再次参考 hex-to-ASCII 图表,发现0x76 对应于字符v

总而言之:我们的d [不正确] 输入与v 的[正确] 输入进行了比较。

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

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多