希望某人可以帮助我了解我正在大学学习的漏洞。
在c代码中,有一个未绑定的strcat
strcat(buffer, argv[1]);
目的是使此缓冲区溢出到保存的EIP中,并使其显示“魔术”字符串,该字符串在以下功能中调用。
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);
}
答案 0 :(得分:0)
有关不同术语的解释和示例,请参见this。
查看您的代码:
magic
存储在.data
中。它指向存储在.rodata
/ .text
或类似名称中的字符串文字。buffer
存储在.stack
中。geteuid()
的结果存储在某个临时位置,CPU寄存器或堆栈中。因此,这没有任何意义。最值得注意的是,程序中的任何地方都没有.bss
分配,除了库函数内部的某些内部。我猜想有人对这个程序有一个迷惑的想法,那就是假设该程序可以用geteuid()
附加的空终止符来覆盖strcat()
的结果……但这也没有任何意义。