第一周(栈溢出)
基本原理:
输入数值过长造成的覆盖。
基本流程:
1.在ida中打开
- 找到问题(在哪个函数中会发生栈溢出)
- python
- 用gdp调试(pause)
- 找断点
- 将返回地址返回目的地址(backdoor)
- 拿到权限
解决:修改长度:
右键打开assembly
直接修改不能覆盖后面的代码,用mov移动
导出
不同的调用约定
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),则通过专用的协处理器浮点数寄存器栈的栈顶返回
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鱼非愚!
评论