首页 > 试题广场 >

在审计某一开源项目的代码时,假设有下面一个foo()子函数的

[问答题]
在审计某一开源项目的代码时,假设有下面一个foo()子函数的实现。 从安全的角度看,会存在安全漏洞吗?有的话,请
(1)描述漏洞细节,
(2)说明可以利用的方法,
(3) 还有该怎么修补漏洞。没有的话,也请说明为什么。
int foo((void*funcp)()) {
    char *ptr = pointer_to_an_array;
    char buf[128];
    gets(buf);
    strncpy(ptr,buf,8)
    (*funcp)();
}
推荐
ptr 定义在 buf 的前面。在栈上开变量的话,后开的内存地址较小,也就是 ptr 是恰好接在 buf 数组的后面。所以如果数组越界就可以修改 ptr 指向的内存地址。
编辑于 2015-02-10 11:36:33 回复(2)
1、*funcp()指针没有进行为空判断。
2、buf数组没有做是否越界的判断。
3、ptr定义在buf之前,在栈上开辟变量,后定义的地址在低位,所以ptr紧跟在buf之后,如果buf越界会覆盖ptr指向的内容。
4、strncpy()只能拷贝字符串,后面还没有分号。

发表于 2015-04-23 11:05:23 回复(0)
如果gets(buf)的长度超过了128字节,那么第129-132字节的内容会覆盖ptr的值,那么在 strncpy(ptr,buf,8)的时候就会改变第129-132字节指定地址开始的8字节的值(这里假设拷贝的这8字节是一段可执行的代码),然后第133-136字节的值又会覆盖funcp的值(这里假设覆盖后的值正好是之前第129-132字节指定地址),那么执行(*funcp)()的时候程序就会跳过去执行那一段注入的奇怪的代码了,后果很严重。。 
发表于 2015-08-05 15:45:09 回复(0)
ptr指向的数组大小不明确,拷贝时容易引起写越界,
如果函数中不修改func的值应加const修饰形参
添加函数返回值
发表于 2016-12-26 16:14:05 回复(0)

发表于 2016-09-19 20:32:55 回复(0)
gets是个很危险的函数,他假定参数是个c风格字符串
发表于 2015-12-16 23:38:55 回复(0)
//(1)  如果ptr的长度没有达到8就会出现bug


发表于 2015-07-30 15:16:21 回复(0)
#include<>
发表于 2014-12-07 16:41:04 回复(0)
求解
发表于 2014-10-10 18:32:07 回复(0)