基本原理:

输入数值过长造成的覆盖。

基本流程:

1.在ida中打开

  1. 找到问题(在哪个函数中会发生栈溢出)
  2. python
  3. 用gdp调试(pause)
  4. 找断点
  5. 将返回地址返回目的地址(backdoor)
  6. 拿到权限

解决:修改长度:

  1. 右键打开assembly

  2. 直接修改不能覆盖后面的代码,用mov移动

  3. 导出

不同的调用约定

cdecl调用规定

函数参数按照从右到左的顺序入栈

支持调用可变参数函数

对C函数的名字修饰约定特点:函数名前加上下划线

stdcall调用约定

主调函数参数从右向左入栈

除指针或者引用类型外用数值传递的方式

C函数,stdcall名称修饰方式是在函数名字前添加下划线,在函数名字后添加@和函数参数的大小

fastcall调用约定

常使用ECX和EDX寄存器传递前两个DWORD(四字节双字)类型或更少字节的函数参数,其余参数按照从右向左的顺序入栈

返回值在EAX中

编译器使用两个@修饰函数名字,后跟十进制数表示的函数参数列表大小(字节数),如@function_name@number

thiscall调用约定

naked call 调用约定

pascal 调用约定

调用约定的影响

在不同编译器产生的栈帧得到方式也不太相同,跨平台的开发中调用中,通常选择stdcall约定

X86函数返回值的传递方法

若返回值不超过4字节(如int、short、char、指针等类型),通常将其保存在EAX寄存器中,调用方通过读取EAX获取返回值

若返回值大于4字节而小于8字节(如long long或_int64类型),则通过EAX+EDX寄存器联合返回,其中EDX保存返回值高4字节,EAX保存返回值低4字节

若返回值为浮点类型(如float和double),则通过专用的协处理器浮点数寄存器栈的栈顶返回