2017-03-15 4 views
-2

数週間前にデンマークのサイバーセキュリティセンターで問題が発生しました。 参照https://puzzling.stackexchange.com/questions/49702/programming-news-paper-puzzle/49757課題:コンパイル成功後のアクセス違反の読み取り/実行

挑戦の一部は、アセンブリコードを修正し、処理する.imgファイルを読み込んでコンパイルすることです。このファイルはu5emu.asmと呼ばれます。彼が書いたマイナーなバグがありますhttp://pastebin.com/TChuYF29

:デビッド・Jと呼ば

ユーザーは、ここでは.ASMコードのクリーンアップ版を掲載しました。代わりに、126行目に、それ以外の場合はうまく見えます。私が追加したことは、get libとputcharを.asmコードの_getcharと_putcharに変更して、C libが機能するようにすることでした。また、私は_asm_mainにU5_LEを編集しました。driver.cのmainは_asm_mainを呼び出すからです。

私はやって.exeを作成する限り得ている:実行可能ファイルを作成します

nasm -f win32 u5emu.asm 
gcc -o u5emu u5emu.obj driver.c asm_io.obj 

を。私はかなりプログラムが私に(getcharがあるので)入力を求め、それがインクルードされたファイル(B64でエンコードされた文字列を処理して、[、などのような奇妙な記号を取り除いたもの)とチャレンジの次の部分の手がかりを出す。

私はexeファイルを実行すると、それがクラッシュしたと私はデバッグするとき、私は2種類のエラーを取得:私はここで行き止まりにヒットしました

Unhandled exception at 0x546CD4A1 in u5emu.exe: 0xC0000005: Access violation reading location 0x00000000. 

そして

Exception thrown at 0x00000000 in u5emu.exe: 0xC0000005: Access violation executing location 0x00000000 

ので、誰かをすることができます願って、この問題を解決する方法を私に助けてください。

+2

*ウェイ*コードを読むためのマクロが多すぎます。ただし、* "アクセス違反の読み取り場所0x00000000" *は、NULLポインタを使用することを意味します。それを探し始める。 –

答えて

1

あなたの質問に答えることはできませんが、私が何をしたかを教えていただけます:私は小さなプログラムをCに書き換えました(32個のオペコードのスイッチを使います)。ヒント#2:バイトをスワップすることを忘れないでください。エミュレートされたマシンは大きなエンディアンです。

+0

こんにちはMogens。ヒントに感謝します。私はそれをやろうとします。最初にCにasmを逆アセンブルしてから書き直しましたか、それともasmで終了してCにしましたか? asmファイルには多くのコードがありません。「32個のオペコードにスイッチを使用する」という意味は何ですか?残念ながらアセンブリとCの知識は非常に限られていますが、私はそれを学びたいと思っています – MSJ

+0

アセンブリリストをテンプレートとして使用してC言語でコードを書き直しました。追加する必要のある命令は多くありません。計算されたgotoの代わりにCでスイッチ構造を使用しました。 – Mogens

関連する問題