当溢出时,移动%rbx,%rsi会做什么?

时间:2015-10-27 00:50:57

标签: assembly optimization x86-64

这是我的功能的汇编代码。 这是使用gcc -O2 -fsanitize = undefined

运行的
   0:   55                      push   %rbp
   1:   53                      push   %rbx
   2:   48 ba ff ff ff ff ff    movabs $0x7fffffffffffffff,%rdx
   9:   ff ff 7f
   c:   48 83 ec 08             sub    $0x8,%rsp
  10:   48 8b 1d 00 00 00 00    mov    0x0(%rip),%rbx        # 17 <testovf+0x17>
  17:   48 89 dd                mov    %rbx,%rbp
  1a:   48 01 d5                add    %rdx,%rbp
  1d:   70 0d                   jo     2c <testovf+0x2c>
  1f:   48 39 eb                cmp    %rbp,%rbx
  22:   0f 9f c0                setg   %al
  25:   48 83 c4 08             add    $0x8,%rsp
  29:   5b                      pop    %rbx
  2a:   5d                      pop    %rbp
  2b:   c3                      retq
  2c:   48 89 de                mov    %rbx,%rsi
  2f:   bf 00 00 00 00          mov    $0x0,%edi
  34:   e8 00 00 00 00          callq  39 <testovf+0x39>
  39:   eb e4                   jmp    1f <testovf+0x1f>

据我所知,当1a添加溢出时,它会跳到2c。 然而,在2c之后什么是mov%rbx,%rsi和mov $ 0x0,%edi呢? 他们需要在那里吗?

1 个答案:

答案 0 :(得分:2)

在地址34,您有一个callq外部函数。您询问的两条指令设置了该函数的参数,根据标准的64位调用约定,它们在寄存器rdirsi中传递。

请注意,调用的目标显示为39 <testovf+0x39>,但这不正确。有可能,你从objdump获得了这个列表,忘了使用-r选项来显示重定位条目。