2016-10-11 10 views
0

私は、いくつかのリバースエンジニアリング技術を実践するプログラムを書いています。アセンブリのこれらの行が実行される前に、私はeaxecxに入るバイトを制御することができ、私の入力を通じx86アセンブリでidiv命令がオーバーフローする最小値

mov, eax [ebp - 20] 
cdq 
idiv ecx 

(ネットワークソケット):ここでのx86の関連する行(インテル)アセンブリコードです。

私の質問は:分割オーバーフローを引き起こすために使用できる最小値(正または負)は何ですか(除算オーバーフローは「ゼロ除算」ではありませんが、結果はより大きい32ビットおよび、それゆえよりも、あなたの配当は32ビットであるので!

はあなたの助けのために事前にありがとうございます。 eax(リターン・レジスタ)に

+1

このような入力はありません。すべての結果が適合します。実際には '-2^31/-1'はできません:) – Jester

+0

@harold最小正または負の値として最小値を定義したいと思います。オーバーフローが発生します。完全な虚偽の例として、0xff/3と0xff/2が両方ともオーバーフローを引き起こした場合、私は0xff/2を最小値とみなします。 – jkovba

+0

@ Jesterそこにあなたの提案について考える必要がありますが、64ビットの量を32ビットの量で除算すると、除算のオーバーフローが確実に起こります。しかし、これは乗算の場合ではありません。 – jkovba

答えて

5

に適合しないであろうと、それは、64ビットに符号拡張されますcdqオーバーフローを得る唯一の方法は、2の補数の非対称性、すなわち-2^31を表すことができるが、+2^31を表すことができないことによる。したがって、あなたは-2^31/-1を行うことができます。

+0

私は、それらのバイト境界の1つに沿って起こらなければならないと考えていました。 MSBが符号ビットとして使用されているので、2^n -1から2^nまでカウントすると、符号なしの場合は正常ですが、符号付きの場合は誤って符号ビットを反転しています。オーバーフローが発生します。あなたはまさに正しいです、ありがとうございました! – jkovba

+0

@jkovbaこの計算は、デスティネーション・オペランドに収まらないため、除算エラー例外が生成されることに注意してください。これは0で割ったときに生成されるのと同じ例外です。 –

+0

@RossRidgeこれはまさに私が探しているものです!私はソケットを介してバイトを送信するためにPythonを使用していますが、EAXをオーバーフローさせるための 'idiv'命令を引き起こして例外を生成することによって、特定のメソッドをクラッシュさせたいと考えています。 – jkovba

関連する問題