今回もリモート問題だからリモートでアクセスし、ソースコードを見る
まず、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になるから、やってみよう
出た!!成功!!





