非安全编程演示之格式化字符串(2)
2006-04-02 20:26:42 来源:WEB开发网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()的地址:
更多精彩
赞助商链接