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

気になるのは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がみえる!!