编写最简单的溢出(本机试验)
编写最简单的溢出(本机试验)
先给大家看一个溢出的最简单的例子
#include <stdio.h>
#include <string.h>
char largebuff[] ="1234512345123456====ABCD";
int main (void)
{
char smallbuff[16];
strcpy (smallbuff, largebuff);
}
这些代码是C语言的(也可以改成你所学的语言)
第1-2条是声明需要调用的库函数(应该看得懂吧)
第3条是声明一个变量,并且赋初始值(注意:是在main函数之外声明的)
第6条是声明一个只存放16个字节的变量
第7条是把外部变量赋值到内部变量里(注意:因为strcpy函数不检查变量里的值的大小才会溢出的)
最后说一点,溢出之前必须存在一个指针,该指针的作用是把指针的针头指向运行命令里
这样溢出的代码就成为了运行的代码(多出来的内存数据就成为了运行命令)
——————————以下为魔幻水晶追加————————————————
复制内容到剪贴板代码:
#include <stdio.h>
#include <windows.h>
#include <string.h>
int funstr(char *szsrt,int nnn)
{
char szstr[8];
printf("%d/n",nnn);
strcpy(szstr,szsrt); /*看清楚一个是szstr一个是szsrt*/
return 0;
}
int main()
{
char szsrtt[]="1234567890ab/x12/x45/xfa/x7f"
"/x68/xFF/xE0/xF5/x05"
"/xB8/x42/x24/x80/x7C"
"/xFF/xD0";
funstr(szsrtt,888);
return 0;
}
这个代码是在经过调试以后写出来得。
其中/x12/x45/xfa/x7f是call esp
"/x68/xFF/xE0/xF5/x05"
"/xB8/x42/x24/x80/x7C"
"/xFF/xD0";
这三行分别是
push 99999999
mov eax,0x7C802442
call eax
因为缓冲区不足,可以想象缓冲区是用来存放那个字符串的,可惜他不够大(太贪吃了,跟贪吃蛇学,结果把缓冲区下面的eip给覆盖了,有人或许会问,贪吃怎么了?没事,就是吃多了会爆肚子的,相同拿水桶和水来说就是溢出了。从前到后,从桶底到桶口,流出来得那部分呢就会覆盖到地上了。)。
每次都是当把堆栈平衡做好以后esp都会指向后面的数据的。
所以……所以了就~~~
楼主不要问我为什么改你的帖子,只是为了加的精华以示鼓励。
——————————以下为我不是空气追加————————————————
什么是溢出
溢出:是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。
溢出全名是“缓冲区溢出”缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,然后植入到缓冲区,而再向一个有限空间的缓冲区中植入超长的字符串可能会出现两个结果,一是过长的字符串覆盖了相邻可以执行任意指令,甚至可以取得系统root特级权限。大多造成缓冲区溢出的原因是程序中没有仔细检查用户输入参数而造成的。
2)溢出的成因
1 C/C++比较自由的程序设计语言大量使用随着Unix系统的流行,C语言曾经一度成为程序设计的标准语言,从操作系统到应用软件,80%以上都使用C/C++语言。
2 不安全库函数调用,比如strcpy, strcat, strncpy, strncat
3 操作系统中不安全系统调用,如Windows中vsprintf, WideCharToMultiByte, wsprintf,等
4 程序设计人员的素质以及安全意识不够,一般的程序员没有经过系统的安全编程培训
原文链接:http://www.nohack.cn/bbs/thread-56640-1-1.html