引言
在刚刚开始学习C语言的时候,很多人都用过strcpy这个函数。简单说是一个内存复制的函数。这个函数确实非常方便,但是这个函数是非常不安全,由与这个函数而产生的缓冲区溢出漏洞在很多文章中都有所介绍。我们应该摒弃strcpy的使用,而是用strncpy进行代替。
既然这个函数能造成缓冲区溢出漏洞,那么这个漏洞究竟是什么样子的那,怎么利用这个漏洞那。很多文章对这个却搞的讳莫如深,让人一头雾水。要弄懂这个,我们先了解下Linux下32位程序函数调用约定。
函数调用约定(32位)
以下是一个简单的C程序stackOf.c,后续的内容也是围绕这这个程序展开的。
#include
#include
#include
void vul(char * msg){
char buffer[64] ;
strcpy(buffer,msg);
return ;
}
int main(){
puts("please give me your shellcode:");
char shellcode[256];
memset(shellcode,0,256);
read(0,shellcode,256);
vul(shellcode);
return 0;
}
这个程序的功能很简单,就是将输入的内容复制到buffer中。不过这里有一个问题,buffer只有64个字节,而输入却可以是256个字节,这会引发什么问题那?下面部分再说。这里我们来看在执行 vul(shellcode);的时候,对应的汇编代码是什么样子的那,以及进入vul函数和退出vul函数的时候,堆栈的变化情况。函数调用主要有两个点需要