【问题标题】:Minimum Values to Cause idiv Instruction to Overflow in x86 Assemblyx86 汇编中导致 idiv 指令溢出的最小值
【发布时间】:2023-03-30 20:15:01
【问题描述】:

我正在编写一个程序来练习一些逆向工程技术。以下是 x86 (Intel) 汇编代码的相关行:

mov, eax [ebp - 20]
cdq
idiv ecx

通过我的输入(网络套接字),我可以在执行这些组装行之前控制进入eaxecx 的字节。

我的问题是:我可以使用什么最小值(正或负)来导致除法溢出(除法溢出不是“除以零”错误,而是返回的结果大于32 位,因此不适合eax(返回寄存器)。

提前感谢您的帮助!

【问题讨论】:

  • 没有这样的输入,所有的结果都会适合。实际上也许-2^31 / -1不会:)
  • @harold 我想我想将 minimum 定义为最小的正值或负值 s.t.发生溢出。作为一个完全错误和人为的例子:如果 0xff/3 和 0xff/2 都导致溢出,我会认为 0xff/2 是最小值。
  • @Jester 我将不得不考虑您的建议,但是在将 64 位数量除以 32 位数量时肯定会发生除法溢出。但是,乘法并非如此。
  • 除了这是一个 32 位除法。对 64 位符号扩展除法执行,但仍然是 32 位除法。

标签: assembly x86


【解决方案1】:

由于您的被除数是 32 位,并且它被 cdq 符号扩展为 64 位,因此获得溢出的唯一方法是由于二进制补码的不对称性,即它可以表示 -2^31 但不能表示 @987654323 @。因此,您可以使用-2^31 / -1

【讨论】:

  • 好的,我认为它必须沿着这些字节边界之一发生。由于 MSB 被用作符号位,当我们从 2^n -1 计数到 2^n 时,在无符号的情况下我们会很好,但在有符号的情况下,我们无意中翻转了符号位,这是溢出发生的地方。您完全正确,非常感谢您的帮助!
  • @jkovba 注意这个计算,因为它不适合目标操作数,会产生一个除法错误异常。这与除以 0 时生成的异常相同。
  • @RossRidge 这正是我要找的!我正在使用 Python 通过套接字发送字节,我希望通过在“idiv”指令中导致 EAX 溢出来生成异常,从而使特定方法崩溃。
猜你喜欢
  • 2011-04-24
  • 2011-08-18
  • 1970-01-01
  • 2013-08-11
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多