今回もリモート問題だからリモートでアクセスし、ソースコードを見る

まず、keyに値を入力(10進数)してrandom変数と、XOR演算結果が0xdeadbeefになればOKらしい

だが。。。rand()←こうするとランダムで生成されるけど、毎度同じ数字で生成される

本当にランダムで値を作りたいのであれば、srand()を使うべき

 

ということはrand()で生成された値を見つけて攻略すれば良さそう

なので、gdbで見てみる

まず、rand()関数が呼び出された後のところ(main+18)にブレイクポイントを設定して実行

そして、レジストリを見ると

raxに0x6b8b4567が入っている。これがrand()関数で生成された値だ。(関数はreturnする時、raxに戻り値を入れる)

では、keyの値と0x6b8b4567をXOR演算して、0xdeadbeefがなるようにすれば良い

これが0xdeadbeefの2進数

これが0x6b8b4567の2進数

 

key        = ?

                   XOR
random     = 0110 1011 1000 1011 0100 0101 0110 0111
                   結果
deadbeef   = 1101 1110 1010 1101 1011 1110 1110 1111

 

XOR演算は同じ値だと0になり、違う値だと1になるから

 

key        = 1011 0101 0010 0110 1111 1011 1000 1000
random     = 0110 1011 1000 1011 0100 0101 0110 0111

deadbeef   = 1101 1110 1010 1101 1011 1110 1110 1111

こうなれば良い!

1011 0101 0010 0110 1111 1011 1000 1000を10進数に変換すると

3,039,230,856になるから、やってみよう

 

出た!!成功!!