【安全学习之路】Day45

发布时间 2023-10-13 02:13:11作者: Corax0o0

练习

通过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作与处理部分。