gpt4 book ai didi

c - 基于 BSS 的缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 20:30:42 29 4
gpt4 key购买 nike

希望有人能帮助我了解我在大学学习的一个漏洞。

在c代码中有一个未绑定(bind)的strcat

strcat(buffer, argv[1]);

目的是将该缓冲区溢出到保存的 EIP 中,并让它显示在下面的函数中调用的“magic”字符串。

if (geteuid() == 0) {

printf("%s\n", magic);

} else {

printf("Forget it. You do not have access to the magic string.\n");
return (-1);
}

缓冲区与保存的 EIP 之间的差异是 52 个字节,我的想法是使用 printf 函数的地址溢出缓冲区,该函数将显示魔术字符串,但无法使其正常工作我不断收到内存地址的段错误与我输入的不同。

非常感谢任何帮助。

编辑:下面的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

enum { SIZE = 40 };

/* The magic string */
char *magic = "This is the magic string";

int
main(int argc, char *argv[])
{
char buffer[SIZE];

if (argc != 2) {
printf("Usage: %s name\n", argv[0]);
return (-1);
}

snprintf(buffer, sizeof (buffer), "%s", "Hello ");

strcat(buffer, argv[1]);

printf("%s\n", buffer);

if (geteuid() == 0) {

printf("%s\n", magic);

} else {

printf("Access Denied \n");
return (-1);

}

return (0);
}

最佳答案

有关不同术语的解释和示例,请参阅 this .

查看您的代码:

  • magic 存储在 .data 中。它指向存储在 .rodata/.text 或类似文件中的字符串文字。
  • buffer 存储在 .stack 中。
  • geteuid() 的结果存储在某个临时位置、CPU 寄存器或堆栈中。

所以这没有任何意义。最值得注意的是,程序中的任何地方都没有 .bss 分配,除了库函数内部的一些内部结构。我想有人有一个困惑的想法,假设程序可以以某种方式用 strcat() 附加的空终止符覆盖 geteuid() 的结果...但这并不也没有任何意义。

关于c - 基于 BSS 的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53612165/

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