非安全编程演示之高级缓冲区溢出篇

2008-04-09 03:59:55来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

非安全编程演示之高级缓冲区溢出篇


本文出自: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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:高质量C /C编程指南--第7章内存管理(1)

下一篇:全面保护你的Java程序安全(下)