I made a crackme contains heaven's gate technique.

I uploaded to crackmes.one.

You can download my crackme "Heaven's Gate" from this link!

You should read 64bit code on 32bit memory to find password.

But comparison of key is very simple, so you only do easy calculation to solve. 

Please solve this easy crackme!!!!!!!!!

You can experience heven's gate with easy crackme!!!!!!


I think there are 2 ways to solve.

First, using windbg.

Second, using x32dbg and x64dbg.


I'm not used to windbg, so second way is recommended.

Open exe file with x32dbg, copy 64bit code on 32bit memory and paste 64bit process memory opened by x64dbg (for example, open notepad.exe by x64dbg).

After that, you can easily read 64bit code.


heaven's gate technique is reffered to NTTITON's github.


It's hard for me to use stack in 64bit area.

Many memory access violation occured to make this crackme.

I used inline assembler on Visual C, so I confirmed machine code by writing assembly code to notepad memory with x64dbg many times.

It was very difficult to debug ...


My carckme is finally showed up after 2 days of uploading.

Crackmes may be confirmed by administrator of crackmmes.one?



r0Bさんがめちゃくちゃ丁寧な回答をアップロードしてくれた!!!

これが本物の解き方か……!

自分で問題を作っておいて逆に勉強になる!

俺もこんなきれいな回答書けるように頑張らなければ!!

本当にありがとうございます!!!!


If you don't want to know how to solve, please don't look at the below.


























-----------------------------------------------------------------------------------------

HOW TO SOLVE (I assumed)

まず日本語で書いて英語に翻訳しよ。

x32dbgを使って解いてみる。

適当なパスワードを打つとWrongと表示される。

そのWrongから辿ればパスワードを判定している部分が見つかる。

Correctと表示する条件を見ると、ds:[41A480]が0でないときだとわかる。

その直前の関数(call 4113D4)を見てみる。

さらに飛ばされて以下のコード(jmp 4117A0)にたどり着く。

もっと下の方を見てみると、



ret farで囲まれた部分が確認できる。

一番下のretから上にさかのぼるように見てみる。

関数(call 41124E)があるが中をのぞくとRuntime Checkをしている感じがする。

さらに上に行くと先ほどのds:[41A480]が見つかる。

mov ds:[41A480],eax

と書いてあるためeaxの中身が0以外になればパスワードが正しいと判断していると考えられる。

さらに上に行くとret farがあり、その上には関数を呼んでいるようだがcall 0のためどこにもジャンプしていない不思議なコードが見つかる。

その上にxor eax,eaxでeaxを0にしている部分が見つかる。

ここがパスワードが間違っていた時の処理ではないかとあたりをつけながらさらに上を見る。

するとdec eaxとなぜかeaxを1減らしている不思議なコードが見えるがとりあえずさらに上を見る。

するとmov eax,1とeaxに1を代入しているコードにたどり着く。

ここがパスワードが正しかった時の処理ではないかとあたりを付けてさらに上を見ていくとやたらdec eaxが見えるとともに文字の比較をしている部分が見える。

h, 3, 4, vの文字が確認でき、なんとなくパスワードの比較をしているところだとあたりを付ける。

そこでこの関数が呼ばれたとき追えるように4117A0にブレークポイントを付けておく。

そして適当なパスワードを入力して4117A0にたどり着き、F7を押して進んでいくとret farにたどり着く。

ret farでF7を押すとntdll.dllに飛ばされ、もう一度F7を押すと制御を失いWrongと表示されていることが確認できる。

ここでcrackmes.oneの説明文にあった通り、ret farの部分がheaven's gateであると推測できる。

heaven's gateは64ビット空間を呼び出す技術のことである。

するとこの中身は64 bitのアセンブリ言語で書かれているはずのため、ret farの中身を64bitのアセンブリ言語として読む必要があることが分かる。


適当な64ビットプロセスとしてメモ帳を開いてそこへこのret farの間のコードをコピペすると、


大量にあったdec eaxがなくなってすっきりしている。
これはメモリが32ビットから64ビットになったことで命令が変化し、
dec eax
mov eax,1
mov rax
と変わるなど、64ビットのレジスタの命令になったためである。

あとは入力したデータがどのメモリに保存されているかをたどり、比較されている部分を読み取っていけばパスワードが分かる。
レジスタを用いた比較しかないため読みやすいと思われる。
注意点としてはこの中にあるpopはスタックから64ビットずつレジスタにメモリを移すことである。







IDAの場合
IDAだとret farから読めなくなってる。
やっぱりIDAだと解けない?