观察这个vul函数s是vul函数的局部变量即s是保存在栈上的当gets执行pop ebpret的时候ebp会指向vul函数的ebp而直线写入的s的结果会保存在vul的局部变量s中此时的栈结构是在32位程序中第一个参数ebp8会先赋值给eax函数执行结束会把返回值存入eax在64位程序中第一个参数存放在rdi函数执行结束会把返回值存入eax此程序为32位fgets的返回值是写入变量的地址即将s的地址写入eaxeax指向局部变量s的地址因为对s栈溢出当前ebp地址中的值被修改eip也被修改当执行vul函数ret后会把ip变成我重新设定的eip中,实现栈溢出所以计算偏移就是局部变量s和vul的ebp地址的偏移