[HDCTF2019]Maze(リバースエンジニアリング入門)

添付ファイルをダウンロードして解凍し、便宜上、ファイル名を maze.exe に変更しました。

通常、最初にシェルを確認します。確かに UPX シェルが存在します。

リバースエンジニアリング初心者の私にとってはワンクリックで外せます笑

しかし、この種の砲撃プロセスは他の損傷や影響を引き起こす可能性があり、特定の修理が必要になる可能性があると言わざるを得ません。

シェルがなくなっていることがわかりますので、exe ファイルを実行してみます。

おそらく、フラグを取得するには正しいものを入力する必要があることを意味します 

確認したところ、これは32ビットプログラムです

IDA でファイルを開き、F5 で逆コンパイルしましたが、応答がないことがわかりました。

プログラムが停止する場所を観察します。ここの jnz 命令はジャンプを実装し、下の 0EC85D78Bh は赤でマークされています。これは存在しないアドレスである必要があります。これらにより、IDA は元のコードを正常に逆アセンブルできなくなります。花の説明書として。

それらを Nop で削除する必要があります (つまり、Nop 命令を使用してそれらを空に変更します。Nop の 16 進数は 90 です)。

このオプションを見つけてください

75位から58位まで行く必要がある 

 OK の後、これらの 4 行は空になります。

 このオプションをもう一度見つけてみましょう

OK、実際には成功しました。最初にファイルをデスクトップに配置したとき、十分な権限がなかったようです。

(アクセス許可が不十分であるというエラー メッセージが表示された場合は、ファイルを C ドライブではなく D ドライブまたは他のドライブに配置してみてください)

 ここで、IDA を使用して変更されたファイルを開き、F5 キーで正常に逆コンパイルできるようになりました。

 ねぇ~、wsadってなんでこんなに見覚えがあるの? これってキーボードの上下左右のキーじゃないですか?

リバース エンジニアリングを長くやっていると、これがリバース エンジニアリングの典型的な迷路問題であることがわかるでしょう。

上記の関数に従って迷路の内容を見つけました

フォーマット データベース '%14s' はフォーマット文字列です。%14s は文字列をフォーマットし、14 文字の幅を占めることを意味します

(迷路では 14 歩しか歩く必要がなく、それしかできないことは理解できます)

緑色のボックス内にあるものは、プログラムの実行時に出力されるものです。

迷路のコンテンツをエクスポートします。合計 70 の位置があります。ここでは 10*7 の迷路であると推測します。

迷路を構築する

def main():
    maze = "*******+********* ******    ****   ******* **F******    **************"
    sid = maze.index("+")
    eid = maze.index("F")
    ex,ey = -4,5
    c = (eid - ey) // (-ex)
    r = len(maze) // c
    print(r,c)
    for i in range(r):
        print(maze[c*i:c*(i+1)])

if __name__ == "__main__":
    main()

+ から 14 のステップを経て F まで進む必要があります。 

この図は誤解を招きやすいので、以下に説明します。

実際には+とFが*で挟まれており、縦の*の間にスペースはなく、1つの*が1つのグリッドに対応します。

 これは次の図と同等になります。

 

ここで選択できるルートは一意ではないため、複数のフラグが必要です。

考えられる 2 つの動きを以下に示します。

aasssssssswwww または ssaaasaassdddw (左下右、キーボードによって異なります)

すべてが可能です

 ついに旗を手に入れた

フラグ{aasssssssswwww} または フラグ{ssaaasaassdddw}

おすすめ

転載: blog.csdn.net/Myon5/article/details/131663816