非安全编程演示之高级缓冲区溢出篇
2008-04-09 03:59:55来源:互联网 阅读 ()
本文出自:http://xfocus.org/ 作者:alert7(alert7@netguard.com.cn)
声明:文中的大部分演示程序来自qera <gera@core-sdi.com>,感谢qera为
我们精心构造这些很能说明的演示程序。
有些程序可能有不只一种的利用方法,而文中又没有提到的。如果您有
好的idea,记得mailto:alert7@xfocus.org,不正确或者不当之处还
请斧正。
★★ 一 高级缓冲区溢出篇
★ 1.1 演示一----盲目服从(blind obedience)
定义的buf太小,需要copy的数据不足以容纳下。
/* abo1.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* Dumb example to let you get introduced... */
int main(int argc,char **argv) {
char buf[256];
strcpy(buf,argv[1]);
}
这是个很好的例子程序,很能说明问题:该程序将拷贝argv[1]到buf中,使用了
strcpy函数,没有做任何的边界检查。这就给了我们一个机会,传一个超长的
argv[1]进去,覆盖到堆栈中buf后面的数据。你需要利用所有的工具来查看
buf后面到底是什么重要的东西,然后才能构造出那些exploit需要的摸板。
★ 1.2 演示二----执行流程(execution flow)
在来看看这个程序
/* abo2.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* This is a tricky example to make you think *
* and give you some help on the next one */
int main(int argv,char **argc) {
char buf[256];
strcpy(buf,argc[1]);
exit(1);
}
正如我们看的那样,在这个例子中,加了个exit(). 发现了不同了吗?一般利用覆盖
main的返回地址的方法已经行不通了。在这个例子中,windows下利用windows的异常
机制可以成功的溢出这个程序,而在unix下就没有这种特性,暂时还不知道如何溢出
这个程序?或者就根本不能利用。欢迎讨论,请mailto:alert7@xfocus.org :)
★ 1.3 演示三----覆盖函数指针
/* abo3.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* This'll prepare you for The Next Step */
int main(int argv,char **argc) {
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;
char buf[256];
fn=(void(*)(char*))&puts;
strcpy(buf,argc[1]);
fn(argc[2]);
exit(1);
}
可利用缓冲区溢出覆盖fn函数指针,达到攻击目的。
★ 1.4 演示四----覆盖指针,导致任意地址的覆盖
/* abo4.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* After this one, the next is just an Eureka! away */
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;
int main(int argv,char **argc) {
char *pbuf=malloc(strlen(argc[2]) 1);
char buf[256];
fn=(void(*)(char*))&puts;
strcpy(buf,argc[1]);
strcpy(pbuf,argc[2]);
fn(argc[3]);
while(1);
}
第一个strcpy时候,可覆盖到pbuf指针,可使pbuf指向fn地址,所以第二次
strcpy的时候就会覆盖到fn指针,结果运行fn()函数的时候就可以执行任意
函数调用,比如system();
★ 1.5 演示五----ch-ch-ch-changes
/* abo5.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* You take the blue pill, you wake up in your bed, *
* and you believe what you want to believe *
* You take the red pill, *
* and I'll show you how deep goes the rabbit hole */
int main(int argv,char **argc) {
char *pbuf=malloc(strlen(argc[2]) 1);
char buf[256];
strcpy(buf,argc[1]);
for (;*pbuf =*(argc[2] ););
exit(1);
}
第一个strcpy时候,可覆盖到pbuf指针,可使pbuf指向exit的GOT或者.dotrs地址 4,
从而可以覆盖到那些部分,获得控制权。
★ 1.6 演示六
/* abo6.c *
/* specially crafted to feed your brain by gera@core-sdi.com */
/* wwwhat'u talkin' about? */
int main(int argv,char **argc) {
char *pbuf=malloc(strlen(argc[2]) 1);
char buf[256];
strcpy(buf,argc[1]);
strcpy(pbuf,argc[2]);
while(1);
}
第一个strcpy时候,可覆盖到pbuf指针,可使pbuf指向第二个strcpy函数的返回地址,
从而可以覆盖到该地址,第二个strcpy一返回就可以获得控制权。
★ 1.7 演示七
/* abo7.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* sometimes you can, *
* sometimes you don't *
* that's what life's about */
char buf[256]={1};
int main(int argv,char **argc) {
strcpy(buf,argc[1]);
}
[alert7@redhat]$ gcc -o test test.c -g
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash