WEB开发网
开发学院网络安全黑客技术 非安全编程演示之格式化字符串(2) 阅读

非安全编程演示之格式化字符串(2)

 2006-04-02 20:26:42 来源:WEB开发网   
核心提示:sh-2.05# exitexituser@CoreLabs:~/gera$ 下面是例子溢出时heap memory的情况:/ | | | | | |GOT | | | | | |\ |______________________| |_________________________| |______________
sh-2.05# exit
exit
user@CoreLabs:~/gera$

下面是例子溢出时heap memory的情况:

/ | | | | | |
GOT | | | | | |
\ |______________________| |_________________________| |_______________________|
/ | 0x00000000 | | 0xb f f f 0000 | | 0xb f f f f f c d |
.dtors |-----------------| |--------------------| |--------------|
\ | 0xf f f f f f f f | | 0xf f f f f f f f | | 0xf f f f f f f f |
|------------------| |---------------------| |--------------|
/ | 0x00000000 | | 0x00000000 | | 0x00000000 |
.ctors |----------------| |-----------------| |--------------|
\ | 0xf f f f f f f f | | 0xf f f f f f f f | | 0xf f f f f f f f |
|------------------| |-------------------| |-----------------------|
| | | | | |
Before first snprintf() After first snprintf() After second snprintf()

fs3.c分析


例子的源代码如下:


/* fs3.c *
* specially crafted to feed your brain by riq@core-sdi.com */


/* Not enough resources? */


int main(int argv,char **argc) {
char buf[256];


snprintf(buf,sizeof buf,"%s%c%c%hn",argc[1]);
}


看起来与fs2.c非常相像。不同之处在于,攻击者只能在内存中写入两个字节,不足
一个确切内存地址(在32位 IA上需要4字节)。如果攻击者够聪明的话,他将在适当的地址覆盖两字节(比如,shellcode的地址在0xb f f f f f b a,某个返回地址是 0x b f f f a b c d,那么他将仅仅用ffba去覆盖abcd)。这是攻击者要覆盖的。这里有一些可能性。首先fs3的返回地址(在栈上--0xb f f f x x x x确定)将因为不同的环境变量压栈而变的难于猜测。其次snprintf()的返回地址(同样在栈上--0xb f f f x x x x确定)也很难猜测。
heap上的地址可以确定(可以从bin文件得到)。第三种方法就是覆盖.dtors的地址。
然后这并不会起很大的作用。看看fs2.c的那个图就知道。0x00000000的地址经过覆盖后,变成了0x0000f f b a或0xb f f f0000之一---在这里完全没有用。那么现在剩下的唯一可能的方法就是覆盖GOT中的__deregister_frame_info()的地址:

1 2 3 4 5 6  下一页

Tags:安全 编程 演示

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接