ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

Windows Pwn相关知识

2019-08-25
ble55ing


Windows Pwn相关知识

ctf比赛中的Windwos Pwn题目愈发的多了,学一波

杂乱的Windwos相关知识

Windows x64平台fastcall调用约定

Windwos有三种调用方式,待续

如何将值放入xmm的方式,待续

下面是参考资料1中的描述

1 前四个整型或指针类型参数由RCX,RDX,R8,R9依次传递,前四个浮点类型参数由XMM0,XMM1,XMM2,XMM3依次传递。

2 调用函数为前四个参数在调用栈上保留相应的空间,称作shadow space或spill slot。即使被调用方没有或小于4个参数,调用函数仍然保留那么多的栈空间,这有助于在某些特殊情况下简化调用约定。

3 除前四个参数以外的任何其他参数通过栈来传递,从右至左依次入栈。

4 由调用函数负责清理调用栈。

5 小于等于64位的整型或指针类型返回值由RAX传递。

6 浮点返回值由XMM0传递。

7 更大的返回值(比如结构体),由调用方在栈上分配空间,并有RCX持有该空间的指针并传递给被调用函数,因此整型参数使用的寄存器依次右移一格,实际只可以利用3个寄存器,其余参数入栈。函数调用结束后,RAX返回该空间的指针。

8 除RCX,RDX,R8,R9以外,RAX、R10、R11、XMM4 和 XMM5也是易变化的(volatile)寄存器。

9 RBX, RBP, RDI, RSI, R12, R14, R14, and R15寄存器则必须在使用时进行保护。

10 在寄存器中,所有参数都是右对齐的。小于64位的参数并不进行高位零扩展,也就是高位是无法预测的垃圾数据。

虚表的vtable继承

1 当类继承了父类(父类含有虚函数),或者类中本来就有虚函数,那么编译之后就会产生虚表。

2 若A、B继承了父类C,那么在rdata段中将会有连续的空间存放A继承C的虚函数指针、B继承C的虚函数指针

3 实例化A或B时,将会在栈空间,则地址的首部放置指向虚表的指针,紧接着是各个局部变量;若是new()创建,则是堆空间,这时局部变量放置到栈空间,malloc的变量放置到堆空间。

Windows的安全防护机制

参考另一篇文章请https://ble55ing.github.io/2019/08/18/WindowsPwn0/

参考资料

https://introspelliam.github.io/2017/08/05/pwn/XMAN%E4%B9%8B%E6%97%85-windows-exploit-technique/


Similar Posts

Content