gpt4 book ai didi

c - 理解 extern 和 void 函数指针

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:45 25 4
gpt4 key购买 nike

我的主图是这样的:

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);
}

我对 extern 关键字的含义及其在此代码中的工作方式有一个大致的了解。我对 fn 函数的声明感到困惑。这里声明的是函数指针,还是函数?另外,为什么 &system&putsfn 定义的末尾。

最佳答案

此代码是一个高度人为设计的示例,说明如何使用缓冲区溢出来调用代码最初未设计调用的函数。它不应被视为代码编写良好的示例,事实上恰恰相反。

下面一行声明了一个指向函数的指针,并将其初始化为指向system 函数。

 void (*fn)(char*)=(void(*)(char*))&system;

请注意,如所写,代码从未实际调用 system 函数,因为以下行将指针更改为指向 fputs 函数。

 fn=(void(*)(char*))&puts;

程序中的漏洞就在这一行

strcpy(buf,argc[1]);

如果 argc[1]strlen 大于缓冲区大小,则缓冲区溢出可能会改变值 fn 指向某个任意函数,然后将由这一行调用

fn(argc[2]);

旁注:正如有人在评论中指出的那样,argcargv 的名称应该互换。

关于c - 理解 extern 和 void 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23659716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com