【安全学习之路】Day45
练习
通过createfile这个API了解栈在32位和64位下的工作方式。
Stack32
用OD打开这个在32位环境下编译出来的程序
结合上图可以看到在这个32位里面
- 它不使用栈帧。
- 它调用子函数时使用栈传递参数。
- 它调用push进行压栈的参数不需要main()共同清理,在32以stdcall方式调用win32api的时候,由被调用者清理栈。
在此之后
可以看到API内使用了栈帧,调用CreateFilew的api之前使用push指令将接受的参数压入栈,这样栈中就有两份相同的参数。
stack64
64位用WDG了
进去之后看起来比较复杂
代码特点
- 使用变形的栈帧。在起始部分分配了48h字节大小的栈,最后在RET命令之前释放。
- 几乎没有push/pop指令。前四个参数使用寄存器:RCX,RDX,R8,R9。第5到7个参数使用栈。main函数开始执行的时候,用MOV把参数放到站里面。然后子函数不会扩展栈或者分配到栈。main的函数的栈管理由main自己负责,子函数不需要管理通过栈传递的参数。
- 第五个参数之后的参数在栈中的存储位置。其中预留了四个用寄存器传递参数的位置。
先看一下由寄存器与栈传递来的参数。栈传递的参数之上是参数1~4的预留空间。虽然未在传递函数参数时使用,但是从代码37-3的前3个指令可以看到向该空间赋值的操作。
小结
x64不止是x86的扩展,设计的时候做了很多改变。
PE32+
这是64位Windows下使用的可执行文件格式。
之前讲过64位win的虚拟内存是16T,低位给用户模式,高位给内核模式。为了适应改变后的虚拟内存,原PE文件格式做了修改。
PE32+
64位本地模式中运行的PE文件格式被称作PE32+。这是在32位pe上扩展而来。
主要讲讲不同
IMAGE_NT_HEADERS
PE32区别在与第三个成员,前者是header64,后者header32,后面ifdef作与处理部分。