新年あけましておめでとうございます。
2024年1発目の記事は、2023年12月30日から2024年1月3日まで開催されました、ASUSN CTFのWriteup記事です!
(人生初のWriteup記事です)
今回は、数ある問題の中で、自分で面白い解き方したなと思うものを厳選して公開いたします。
Reversing フラッシュ機械語
x86_64の命令を実行した結果として、レジスタraxの値がFlagとなる問題です。
x86_64命令を調べたところでよくわからん。ということで、GPTさんに聞いてみる事としました。今回使ったGPTのは、AzureのGPT4です。
まずは、素直にGPT4に聞いてみると
x86_64の命令として実行した場合のレジスタraxの値を教えて 48 31 c0 48 ff c0 48 ff c8
まさかの、解説付きで教えてくれるじゃないかい!(大感謝)
あなたが提供した命令列をx86_64アーキテクチャで解釈すると、次のようになります: 1. 48 31 c0: XOR RAX, RAX(RAXレジスタの値を0にリセット) 2. 48 ff c0: INC RAX(RAXレジスタの値を1増加) 3. 48 ff c8: DEC RAX(RAXレジスタの値を1減少) したがって、これらの命令が順に実行された後のRAXレジスタの値は0になります。
そこで調子に乗り、次の問題も聞いてみる。
48 c7 c0 12 34 56 78 の場合は?
またしても、解説付きで答えてくれた!!!!(最高)
あなたが提供した命令列をx86_64アーキテクチャで解釈すると、次のようになります: 48 c7 c0 12 34 56 78: MOV RAX, 0x78563412 したがって、この命令が実行された後のRAXレジスタの値は0x78563412になります。
Flagは10進数での入力なので、変換もしてもらいましょう。
RAXレジスタの値を10進数に変換して
変換もちゃんとできるやん(それぐらい自分でやれ)
RAXレジスタの値0x78563412を10進数に変換すると、それは2018915346になります。
GPT4が賢くてとてもありがたい。本来の解き方では無いと思いますが、GPTをうまく使う事でCTFも解けるんだなと楽しくなってきました。
では、最後の問題もGPTに聞いてみると
48 31 c0 48 05 80 f0 fa 02 48 2d 9b 19 c6 01 の場合は?
ふむふむ
1. 48 31 c0: XOR RAX, RAX(RAXレジスタの値を0にリセット) 2. 48 05 80 f0 fa 02: ADD RAX, 0x2faf080(RAXレジスタに0x2faf080を加算) 3. 48 2d 9b 19 c6 01: SUB RAX, 0x1c6199b(RAXレジスタから0x1c6199bを減算) したがって、これらの命令が順に実行された後のRAXレジスタの値は0x2faf080 - 0x1c6199b = 0xE4E6E5になります。
先ほどと同じように、10進数に変換してもらってと。
RAXレジスタの値を10進数に変換して
RAXレジスタの値0xE4E6E5を10進数に変換すると、それは14912325になります。
そのまま、得られたFlagを投げると間違いと出てきました。(おいおいおい。最後にGPTさんバカしやがった!)
ということで、どこから間違えたのかを考えましょう。
1, 2, 3 の命令の解説は今までの回答を見ていると、当たっている可能性が高い。と言うことは、計算が間違っている可能性があると思い、0x2faf080 - 0x1c6199b
をGoogle先生に解いてもらうと、
0x134D6E5
おっと、GPTさんの計算結果と異なるぞ!GPTさんはやはり計算は不得意ですね。。。10進数への変換くらいはやってくれるでしょうと、聞いてみると
0x134D6E5 を 10進数に変換して
ふむふむ
16進数の値0x134D6E5を10進数に変換すると、それは20202021になります。
得られたFlagを投げると間違いとなりました。。。(オイオイオイオイ
さっきの問題、10進数への変換できてたのに。。。
仕方ないので、変換サイトに投げて得られた結果で正解することができました。
まとめ
GPTを使ってFlagを得ることはできる。だが、やはり万能ではない。が、Binaryの解説をしてくれる事は分かったので、上手く使えばいいパートナーになりそうですね。
ASUSN CTF とても楽しめました。IPPONも取ることができ5位とのことで大満足です。
次回も参加してみたいな。
それでは。