Tar*_*n R 1 assembly stack dos
DOS 可执行文件的前 2 个字节是 0x4d 和 0x5a。如果这些被执行,0x4d 意味着'dec ebp',0x5a 是'pop edx'。
'dec ebp' 将基指针减 1,'pop edx' 将 esp 的值增加 4(x86 程序集)。我的问题是这些操作不会使堆栈处于不一致的状态吗?而且由于命令行参数(如果有)是相对于 ebp 存储的,这些操作不会使命令行参数无法访问吗?
我可能遗漏了一些明显的东西,如果是这样,请幽默我...
与 COM 类型的可执行文件(从程序映像的第一个字节开始执行)不同,EXE 类型的可执行文件不应以可执行代码开头。在 EXE 文件的开头有一个标题块,其中包含实际程序入口点的地址等。
因此,字节“MZ”(或 - 据称同样有效 - 'ZM')不代表指令。它们只是用于识别格式的标记。
维基百科文章DOS MZ executable 中有一个很好的概述。
注意:可执行文件的 DOS 部分是隐式的 16 位实模式,应该按原样反汇编,而不是 32 位代码。