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

时间:2017-03-15 12:59:30

标签: debugging gcc assembly

几周前,丹麦网络安全中心出现了挑战。 见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

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

1 个答案:

答案 0 :(得分:1)

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