C 写文件读取代码时溢出

C 写文件读取代码时溢出,c,file-io,environment,C,File Io,Environment,我试着玩一下堆栈溢出和安全cookie, 但似乎大多数使用POC教程的人编写的教程程序都不是使用安全cookie编译的 所以我决定创建一个从文件中获取输入并创建缓冲区溢出的程序。 这就是我得出的结论: #include <stdio.h> #include <string.h> void manipulate(char *buffer) { char newbuffer[80]; strcpy(newbuffer, buffer); } int mai

我试着玩一下堆栈溢出和安全cookie, 但似乎大多数使用POC教程的人编写的教程程序都不是使用安全cookie编译的

所以我决定创建一个从文件中获取输入并创建缓冲区溢出的程序。 这就是我得出的结论:

#include <stdio.h>
#include <string.h>

void manipulate(char *buffer)
{
    char newbuffer[80];
    strcpy(newbuffer, buffer);
}

int main()
{
    char ch, buffer[4096];
    char filename[] = "exploit.txt";
    int i = 0;
    FILE *inFile;

    inFile = fopen(filename, "rb");
    if (inFile == NULL)
    {
        fprintf(stderr, "Can't open input file !\n");
        getchar();
        return 1 ;
    }
    while (buffer[i] != EOF)
    {
        buffer[i++] = fgetc(inFile);
        manipulate(buffer);
        printf("The value of i is : %d\n", i);
        getchar();
        return 0;
    }

}
#包括
#包括
无效操作(字符*缓冲区)
{
char-newbuffer[80];
strcpy(新缓冲区、缓冲区);
}
int main()
{
字符ch,缓冲区[4096];
char filename[]=“exploit.txt”;
int i=0;
文件*填充;
infle=fopen(文件名,“rb”);
if(infle==NULL)
{
fprintf(stderr,“无法打开输入文件!\n”);
getchar();
返回1;
}
while(缓冲区[i]!=EOF)
{
缓冲区[i++]=fgetc(填充);
操纵(缓冲);
printf(“i的值为:%d\n”,i);
getchar();
返回0;
}
}

我的问题是我总是无法打开输入文件\n。即使我在同一个位置创建了“exploit.txt”,并在其中添加了一些“aaaa”。

打开文件的基本原理是正确的。您可以使用
errno
strerror
通知用户尝试打开文件失败的原因,从而改进程序

 #include <errno.h>
 fprintf(stderr, "Error opening \"%s\": %s\n", filename, strerror(errno));
#包括
fprintf(stderr,“错误打开\%s\”:%s\n”,文件名,strerror(errno));
我能够在没有任何更改的情况下成功运行您的示例程序(忽略堆栈溢出部分)

问题在于当前或当前工作目录的值,该值用作用于打开任何文件的完整文件路径的基础

对于Linux、BSD和POSIX系统,可以使用
中的
getcwd()
检查程序的工作目录,对于其他类型的系统,可以使用
\u getcwd()
检查程序的工作目录


吹毛求疵:“txt”文件扩展名与二进制模式下打开的
fopen
相比具有误导性,如
rb

所述,使用绝对文件名或使用api接收其路径和post结果。顺便说一下,c sharp不是研究缓冲区溢出的最佳语言。坚持c.“…在同一位置…”和什么在同一位置??例如:在不更改项目配置的情况下,从调试器运行的VC++程序的默认工作目录是项目文件夹(即.vcprojx文件所在的位置)。把你的输入文件放在那里(假设它是在msdev下运行的)。我把它放在项目文件夹的debug中。只是出于好奇-你为什么要“玩”堆栈溢出?我想写一个可以通过SG的漏洞。