今回はリモート問題だからリモートでアクセスし、ソースコードを見る
気になるのはscanf("%d",passcode1)とscanf("%d",passcode2)の部分だけど
まず、gdbで分析してみよう
welcome関数での中で、sub esp、0x88で変数とダミーで使用される空間(136バイト)を確保している
そして、nameという配列は[ebp-70]から入力が可能ということが分かる
ソースコードで見えたように、100バイト入力可能なので、100を16進数に変換すると64になるから
0xffbba928+64をすると0xffbba98cになるから、0xffbba928から0xffbba98cまでが
nameで入力可能な空間なのが分かる。
次は、login関数を分析する
一番目のscanf()関数を呼び出すところにブレイクポイントを設定して実行
そして、入力可能な空間を調べると
[ebp-10]から入力が可能なことが分かる。(int系だから4バイト)
0xffbba988が[ebp-10]だから+4バイトすると
0xffbba98cになる。
ということは、welcome関数のnameの4バイトとpasscode1の空間が被ることがわかるので、
ここを利用すれば良さそう。
最初に気になったところのscanf("%d",passcode1)の部分で
scanf("%d",passcode1)こういう風に使うと、passcode1の住所を参照して、値が入るのではなく、
passcode1に入っているダミーデータ(passcode1=0みたいに初期化しなかったため)を住所として
値を入れる
つまり、aを100個入れて実行後、ebp-10を見てみると0x61616161が出る
その0x61616161という住所にscanf()で入力された値を入れるということ
mov edx、DWORD PTR[ebp-0x10]で、PTRが[ebp-0x10]の前についているので
[ebp-0x10]の位置にある値を住所として認識する

ということは、nameの最後の4バイトに任意の住所を入れ、次の値でその住所に
入れたい値を入れればOKってこと
私はsystem("/bin/cat flag")を実行したいから
GOTオーバーライトを利用する(PLTとGOTはgoogle先生に聞けば教えてくれる)
scanf("%d",passcode1)の次にfflush(stdin)関数が呼び出されるから
fflush()のGOTをオーバーライトするー
これが、fflush()のPLTだ
PLTはGOTを参照するからjmpについていくと
0x804a004がfflush(stdin)のGOT住所だ
次は、
0x804a004にオーバーライトするsystem("/bin/cat flag")の住所を調べる
espに("/bin/cat flag")を入れるのが見えるから
0x080485e3がsystem("/bin/cat flag")が始まる住所だ
では、exploitしてみる。
前にscanf("%d",passcode1)で%d(10進数)の形式で値を入力されるから、
0x080485e3を10進数に変える必要がある
で、exploitすると、flagがみえる!!











