Tag: 缓冲区溢出

试图缓冲区溢出

我试图使用缓冲区溢出更改函数的结果,以使用以下代码更改堆栈上的结果: #include #include #include int check_auth1(char *password) { char password_buffer[8]; int auth_flag = 0; strcpy(password_buffer, password); if (strcmp(password_buffer, “cup”) == 0) { auth_flag = 1; } return auth_flag; } int main(int argc, char **argv) { if (argc < 2) { printf("Usage: %s \n”, argv[0]); exit(0); } int authenticated = check_auth1(argv[1]); if (authenticated != 1) { […]

gdb显示的地址与代码中的地址不同

我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址。 使用GDB显示的地址与我在代码中执行此操作时的地址不同: 确切代码: #include int main() { char buffer[20]; printf(“%p\n”, buffer); // 0xbffff320 return 0; } 但是,如果我这样做在gdb中: p &buffer 我得到: 0xbffff330 为什么会有差异,它会搞砸我的缓冲区溢出攻击? 我禁用了ALSR和堆栈防护。 谢谢。 编辑1:即使我单步执行gdb并遇到打印行,我也会得到0xbffff320作为地址 编辑2: 环境:在Windows 7上的虚拟框中运行Ubuntu Linux 9映像。 gdb版本:6.8-debian 使用GCC编译,如: gcc -g -fno-stack-protector filename.c立即执行: ./a.out地址打印:0xbffff320 然后在调试器中打开如下: gdb ./a.out然后输入b main然后run p &buffer 然后地址是0xbffff330 编辑3: 这是重现行为的gdb日志: $ gdb ./a.out b主要 跑 这里的p&buffer / *地址与我运行的可执行文件时显示的不同* / […]

安全C和大学 – 训练缓冲区溢出

我最近在C完成了大学课程。所以我当然缺乏经验。 一些大学倾向于教他们的学生安全的编程, 或至少一些元素 。 甚至有一个video (从这里拍摄)。 在C中,复制字符串,据我所知 – strcpy或string.h函数。 如何在日常编程中安全地使用它? 你有一些函数,它们处理分配以防止缓冲区溢出吗? 有C的CERT安全编码标准 。 它提供示例和合规解决方案: int main(int argc, char *argv[]) { /* … */ char prog_name[128]; strcpy(prog_name, argv[0]); /* … */ } 他们的替代方案是: int main(int argc, char *argv[]) { /* … */ char *prog_name = (char *)malloc(strlen(argv[0])+1); if (prog_name != NULL) { strcpy(prog_name, argv[0]); } else […]

为什么缓冲区溢出会在访问整数时导致分段错误?

在从函数A()调用函数B()期间,B()分配一个100-char数组并多次填充,包括一次使用101个字符的字符串,一次使用110个字符的字符串。 这是一个明显的错误。 之后,函数A()尝试访问完全不相关的int变量i,并发生分段错误。 我理解为什么会发生缓冲区溢出,但为什么在访问此整数时会出现分段错误? 为什么我不简单地得到垃圾数据?

sscanf函数更改另一个字符串的内容

我在使用sscanf读取字符串时遇到问题。 我已经愚弄了代码以专注于问题。 下面是整个代码中的一个函数,它应该打开一个文件并读取一些内容。 但是sscanf表现得很奇怪。 例如,我声明一个名为atm的字符串,其内容为’ATOM’ 。 在sscanf之前,它将此字符串作为ATOM打印,而在它之后为空。 可能是什么问题呢? 我认为它必须是分配问题,但我找不到它。 我尝试了其他主题的一些建议,比如用其他东西替换%s ,但它没有帮助。 void Get (struct protein p, int mode, int type) { FILE *fd; //input file char name[100]=”1CMA”; //array for input file name char string[600]; //the array where each line of the data file is stored when reading char atm[100]=”ATOM”; char begin[4]; int index1 =0; fd […]

输入非ASCII字符到scanf(“%s”)

有没有办法可以向使用%s的scanf发出非asciihex字符? 我正在尝试插入hex字符,如\x08\xDE\xAD等等(以演示缓冲区溢出)。 输入不是命令行参数,而是程序内的scanf。

作业 – 无法利用缓冲区溢出

我试图学习在Backtrack Linux上利用简单的缓冲区流技术。 这是我的C程序 #include #include int main(int argc, char **argv) { char buffer[500]; if(argc==2) { strcpy(buffer, argv[1]); //vulnerable function } return 0; } 这是我正在使用的shellcode,它对应于simple /bin/ls \ x31 \ xc0 \ x83 \ xec \ x01 \ x88 \ x04 \ x24 \ x68 \ x6e \ x2f \ x6c \ x73 \ x66 \ x68 […]

如果有人抱怨gets(),为什么不对scanf(“%s”,…)做同样的事情?

从man gets : 永远不要使用gets()。 因为如果事先不知道数据就不可能分辨出get()会读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。 它已被用来打破计算机安全。 请改用fgets()。 几乎每个地方我都看到scanf以一种应该具有相同问题的方式使用( 缓冲区溢出/缓冲区溢出 ): scanf(“%s”,string) 。 这种情况存在这个问题吗? 为什么scanf手册页中没有关于它的引用? 为什么用-Wall编译时gcc不会发出警告? ps:我知道有一种方法可以在格式字符串中指定scanf字符串的最大长度: char str[10]; scanf(“%9s”,str); 编辑:我不是要求确定前面的代码是否正确。 我的问题是:如果scanf(“%s”,string)总是错误的,为什么没有警告,并且手册页中没有任何关于它的内容?

sscanf被认为是安全的吗?

我对sscanf很糟糕的建议有一些模糊的记忆。 我知道如果我使用字段宽度说明符,它不会溢出缓冲区,所以我的记忆只是在玩弄技巧吗?

如何在托管代码环境之外安全编程?

如果您是使用C或C ++编程的人,没有内存管理的托管语言优势,类型检查或缓冲区溢出保护,使用指针算法,您如何确保您的程序是安全的? 你使用了很多unit testing,还是只是一个谨慎的编码器? 你有其他方法吗?