挑战:成功编译后访问违规读取/执行位置



几周前,丹麦网络安全中心提出了一项挑战。 见 https://puzzling.stackexchange.com/questions/49702/programming-news-paper-puzzle/49757

挑战的一部分是修复程序集代码,加载.img文件进行处理,然后编译它。该文件名为u5emu.asm。

一位名叫David J的用户在这里发布了.asm代码的清理版本:http://pastebin.com/TChuYF29

他写的是一个小错误,而不是 ,在第 126 行,否则看起来不错。我还在 .asm 代码中将 getchar 和 putchar 更改为 _getchar 和 _putchar,以便 C lib 可以工作。另外,我将U5_LE编辑为_asm_main:因为driver.c的主要调用_asm_main。

我已经通过做创建了一个.exe:

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

这将创建一个可执行文件。我很确定程序会要求我输入(因为有一个getchar),然后它会处理包含的文件(一个B64编码的字符串,我已经清理并删除了奇怪的符号,如[,;等)并为挑战的下一部分提供线索。

当我运行exe时,它会崩溃,并且在调试时出现两种类型的错误:

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

我在这里陷入了死胡同,所以希望有人可以帮助我解决这个问题。

不是你问题的答案,但我可以告诉你我做了什么:我将小程序重写为 C(使用 32 个操作码的开关)。这使得添加调试打印输出等变得更加容易。提示#2:记住交换字节,模拟机器是大端序。

最新更新