[コードエンジン]基本RCE L 14プール


コードエンジンBasic RCE L 14号の質問に答えました.

実行可能ファイルをDIEにアップロードします.UPSに圧縮されます.

UPX圧縮を開きました.

解凍したファイルをIDAにアップロードし、F5で復号した.そして,有意義に見えるsub_401025関数に入った.

また,win 32 apiには重要なWndProc関数sub_4011E2が加えられている.

中間部にはdowhile演算が表示され、ここではbyte_403037に対して任意の演算が実行され、新しいv5が生成される.
特に、インデックスを表すv7は1から始まり、入力されるNamedword_403038であるため、Nameのインデックス0はbyte_403037のインデックス1と同じである.
すなわち、ここで、byte_403037Nameと同様に問題を見て解答することができる.
sub_401383に入ると、これらの演算が表示され、sub_401383の演算後の名前がv 5と一致しているかどうかを確認します.

同じ場合、aGoodJobIWishYoの見出しはメッセージボックスに出力され、異なる場合、aYouHaveEnterAWの見出しはメッセージボックスに出力される.

各スクリーンショットには、次の情報が含まれます.最終的にGood Job, I Wish You the Very Bestを出力するには、dowhile文の後のv5およびsub_401383(byte_401338)と同じである必要があります.この2つをそれぞれ見てみましょう.

1.do~whileゲート後のv 5


次の復号コードをPythonに変換します.以下に示します.
name = "CodeEngn"
v5 = 0

for ch in name:
  v5 += (ord(ch)>>1) + ord(ch)*ord(ch) - ord(ch)
  
print(v5)
  • Pythonコードでコンパイルされたコードのように、v5を付けなかったのは、v5 +=自体が自分の意味を含んでいるからです.
  • 結果は76193でした.

    2.sub 401383を取得(byte 401338)


    ここで、76193sub_401383(byte_401338)を比較すると、出力Good Job, I Wish You the Very Bestに等しい.
    sub_401383をダブルクリックして中を見ます.これにより、次のコードが表示されます.

    異なる変数名を変更しました.まず、dowhile文では、num = c - '0'は文字を整数にするコードです.
    例えば、Askyコード「3」(51)からAskyコード「0」(48)を減算すると、整数3が残る.
    今、何桁なのか教えてあげます.for文len-1からi-1を使用し、最終的にlen-1号10を0から乗算します.では12345の場合1は1*1000、2は2*1000、3は3*100、4は4*10、5は5*0です.
    △いずれも、アスキーコード「1」、「2」、「3」、「4」、「5」からそれぞれ「0」を減算し、整数1,2,3,4,5で算出したものである.

    結果は76193のように見えますが、以前は文字列だった場合、現在は数字であり、演算前とは異なります.
    正解は数字76193!