gpt4 book ai didi

c - 编写程序,利用程序的堆栈溢出漏洞,获取Linux上的shell

转载 作者:行者123 更新时间:2023-11-30 14:22:49 25 4
gpt4 key购买 nike

Possible Duplicate:
Stack Overflow Exploit in C

我需要编写一个程序来利用以下程序的堆栈溢出漏洞。我从来没有做过这样的事情。我从理论上理解堆栈和溢出是如何工作的。但我对 C 中的实现一无所知。请帮助我。我只需要清楚地了解如何溢出堆栈并生成 shell 代码。

#include <stdio.h>
int myprint(char* argv1)
{
printf("%s", argv1);
}
void foo(char* argv1, char* argv2)
{
int (*fptr)(char*) = myprint;
char buf[12];
strcpy(buf, argv1);
fptr(argv2);
}
int main(int argc, char **argv)
{
if (argc < 3)
{
printf("error\n");
return;
}

foo(argv[1], argv[2]);
}

谢谢

最佳答案

您能够利用此代码的关键是以下两行:

char buf[12];
strcpy(buf, argv1);

您可以在此处看到一个名为 buf 的缓冲区,大小为 12 字节,但空间有限。现在,在下一行中,您将获取 argv1 并将其复制到 buf 中,而不检查 argv1 的大小是否小于buf

这意味着 未检查版本的 strcpy 允许您写入超过 buf 的末尾,然后可能会覆盖该函数的返回地址该函数的堆栈帧。

在函数返回之前的堆栈帧末尾,您通常会在汇编器中找到类似于汇编器中的 ret 的语句(在不同类型的汇编器中可能有所不同,我假设 x86这里),它本质上使用存储在堆栈上的地址跳转回调用者(通常,根据调用约定,在调用该函数之前存储)。

然后,您可以使用指向您放置在某个可用空间中的某些 shellcode 的内容覆盖该地址,这些代码将执行并打开 shell。

这是关于 calling-convention 的部分在 X86 汇编程序中,解释了调用函数时会发生什么,以及序言和结尾是如何完成的。

关于c - 编写程序,利用程序的堆栈溢出漏洞,获取Linux上的shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456718/

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