$ 000オープン環境の
ソースを表示
#include INT {main()の 符号なし整数ランダム。 ランダム =ランド()。 // ランダムな値! 符号なし整数キー= 0 ; scanf関数(" %d個"、&#038 ;キー); もし((ランダム^キー)== 0xdeadbeefが){ のprintf(" !グッド\ N " ); システム(" / binに/猫フラグ" ); リターン 0 ; } のprintf(" 間違った、多分あなたは2 ^ 32例を試してみてください。\ n個" ); 戻り 0 ; }
ソースコードからわかるように、ランダムシードを追加しない場合、ランドは、擬似乱数を生成し、あなたがランダムな数字のうち、実行するたびに、そのような「にsrand((符号なし)時間(NULL))を」初期化するためのランダムシードとして、同じですが、乱数は毎回異なって生成されます。
0x001のエクスプロイト
私たちは、乱数の値を知ることができ、その後、0xdeadbeefがXOR、あなたは私たちが入力した値は、異なるまたは可逆など、任意の二つの値が異なるか、第三の外であることを知ってもらうことができます。
gdbでのデバッグの下では、主な機能を出力します
見やすい、RBP-8は、私たちの入力の値であり、RBP-4 * 0x40062fにブレークポイントを設定し、ランダムな値を生成しています。
RBP-4値はランダムデータのアドレスでご覧ください。
その後、値と0xdeadbeefが位相が、結果は我々が入力するデータです。