アイジア

CTF, 情報セキュリティの学んだことメモ

Reversing.kr easy crack

Reversing.Kr

普通に実行してみる

f:id:favoritte15:20180430113905p:plain

パスワードを聞かれる。わからん。

 

IDAで開く

・IDAのFunctionウィンドウからWinMain関数を見てみると、ダイアログを出す命令DialogBoxParamがある。

f:id:favoritte15:20180430114521p:plain

DialogBoxParam 関数

int DialogBoxParam(
HINSTANCE hInstance, // アプリケーションのインスタンスのハンドル
LPCTSTR lpTemplateName, // ダイアログボックステンプレートを指定します
HWND hWndParent, // オーナーウィンドウのハンドル
DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ
LPARAM dwInitParam // 初期値
);

ここのlpDIalogFuncというプロシージャがダイアログボックスの処理を担当しているはずなのでDialogFuncの処理を見てみる。

 

 

f:id:favoritte15:20180430114620p:plain

DIalogFuncではsub_401080という関数を呼び出しているのでとりあえずそこを見ていく。

 

 

f:id:favoritte15:20180430115009p:plain

 

sub_401080ではダイアログのテキストを取得するGetDlgItemTextAが実行されている。

GetDlgItemText 関数

UINT GetDlgItemText(
HWND hDlg, // ダイアログボックスのハンドル
int nIDDlgItem, // コントロールの識別子
LPTSTR lpString, // テキストを受け取るバッファへのポインタ
int nMaxCount // 文字列の最大サイズ
);

ダイアログボックスから取得したテキストはlpStringが指すアドレスに格納しているのでこの部分を使って比較している可能性が高い。

 

String = -0x64

[esp+0x6C+String] = [esp+0x6C-0x64] = [esp+8] 

バッファのポインタlpStringは[esp+8]であることが分かる。その後GetDlgItemTextAが呼び出されてそこに入力文字列が格納される。GetDlgItemTextAが呼び出された直後は、pushされた引数がなくなってespが増加するので先頭バッファのポインタは[esp+4]と表せる。

ここでは[esp+5](入力した文字列の2番目)と0x61(ASCIIコードで「a」)を比べている。

 

f:id:favoritte15:20180430115501p:plain

次に、「push 2」が実行されたのでespが4減って先頭バッファは[esp+8]になる。

[esp+0xa](バッファから3番目)と5yを引数としてstrcmp関数を呼び出しているので3,4番目の文字列は5yであることが分かる。

 

f:id:favoritte15:20180430115638p:plain

さらに進む。

strcmpを呼び出してから2回pushされたのでバッファ先頭は[esp+0x0C]になる。

[esi]に文字列「R3versing」

[eax] に [esp+0x10] (バッファの5番目以降の文字列)を格納する。

 

 f:id:favoritte15:20180430115940p:plain

 

[eax]をdlに、[esi]をblに入れて文字列の5番目から最後までを繰り返し処理によって比較している。

 

最後に

f:id:favoritte15:20180430120311p:plain

で先頭の文字と0x45(E)を比較して、あっていたら正解の処理へ進む。

 

これらのことからパスワードは

Ea5yR3versing

であることが分かった。