网站建设做什么,在哪个彩票网站是小黄人做头像的,北京云无限优化,网络工程师高级职称今天老师给了一到程序#xff0c;让我们分析分析原理#xff0c;关于strcpy缓存溢出原理的#xff0c;反汇编一遍遍调试#xff0c;终于看明白了#xff0c;记录一下 C程序#xff1a;
#include string.h
#include stdio.h
char *shellcode让我们分析分析原理关于strcpy缓存溢出原理的反汇编一遍遍调试终于看明白了记录一下 C程序
#include string.h
#include stdio.h
char *shellcode\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00;
void fun1(int a, int b)
{printf(fun1 run!para a%d,b%d\n,a,b);
}
void fun2(int a)
{printf(fun2 run! para a%d\n,a);
}
void fun3(int a,int b,int c)
{printf(fun3 run! para a%d,b%d,c%d\n,a,b,c);
}
int main(int argc, char* argv[])
{printf(begin\n);char a[4]{0};strcpy(a,shellcode);fun1(2,3);fun2(4);fun3(4,5,6);return 0;
}运行结果 可以看出按照正常的C的话fun2函数应该只会执行一次但执行了两次事出反常必有妖让我们来分析一下反汇编
当程序执行strcpy前a的值是0x0019ff2c这个是地址存放的是0000000在这里我们要特别注意0019ff30和0019ff34地址里面的值后面执行fun2会用到 执行完strcpy后a内容是地址为0x0019ff2c存放的值我们可以看到0019ff30和0019ff34地址存放的内容发生了改变这个时候我们再看C程序中shellcode数组的值
char *shellcode\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00;发现0x0019ff2c到0019ff34存放的数据就是这些值而且0019ff30和0019ff34存放的数据被这些覆盖了。a数组大小为4shellcode是12a的数组存放不了shellcode的值而strcpy函数不会检查要复制的内容的大小只管把要复制的内容复制过来内存不够覆盖内存中其他数据。
当执行完fun3是按说应该程序结束来让我们看看为什么fun2还会执行 当执行到pop ebp是当前esp的值为0019ff30内容为68697071执行完后ebp的值就是68697071ebp的值原本不是这个因为使用strcpy把原本的内容覆盖了 当执行到ret时这个时候我们就要注意了因为执行完这条语句就会去执行fun2函数ret指令相当于执行
pop eip这个时候esp的值为0019ff34内容为00401005执行ret后eip00401005 我们来看看fun2函数地址是00401005这就是为什么执行完fun3回去执行fun2
总结
strcpy 函数不对数组边界进行检查只管把要复制的内容复制过来内存不够覆盖内存中其他数据很容易造成缓冲区溢出的漏洞shellcode数组里的值一共12位最后ret语句会把最后4位赋值给eip我们可以利用这个跳转到我们想要执行的代码处向缓冲区内填充数据如果数据的长度很长超过了缓冲区本身的容量那么数据就会溢出存储空间而这些溢出的数据还会覆盖在合法的数据上这就是缓冲区和缓冲区溢出的道理。
参考
https://blog.csdn.net/yahohi/article/details/7724669 https://blog.csdn.net/xiaoyuai1234/article/details/52121588