Tag: buffer overflow

使用strcat追加字符数组不起作用

有人可以告诉我这段代码有什么问题吗??? char sms[] = “gr8″; strcat (sms, ” & :)”);

C缓冲区溢出 – 为什么有一个固定的字节数会导致段错误? (Mac OS 10.8 64位,铿锵)

我在C中试验缓冲区溢出,发现了一个有趣的怪癖: 对于任何给定的数组大小,似乎有一定数量的溢出字节可以在SIGABRT崩溃之前写入内存。 例如,在下面的代码中,10字节数组可以在27处崩溃之前溢出到26个字节。类似地,在第41个char中止之前,20个char的数组可以溢出到40个char 。 谁能解释为什么会这样? 此外,SIGABRT是否与“分段故障”相同(或由其引起)? Mac OS 10.8 – Xcode 4.6,clang和lldb。 谢谢! #include int main(int argc, const char * argv[]) { char aString[ 10 ]; char aLetter = ‘a’; printf(“The size of one array slot sizeof( aString[0] ) is %zu\n”, sizeof(aString[0])); printf(“The size of one letter sizeof( aLetter ) is %zu\n”, sizeof(aLetter)); // Overflow […]

C中的内存分配

我有一个关于内存分配顺序的问题。 在下面的代码中,我在循环中分配4个字符串。 但是当我打印地址时,他们似乎并没有一个接一个地分配……我做错了什么,或者是OS实施的某种防御机制,以防止可能的缓冲区溢出? (我使用的是Windows Vista)。 谢谢。 char **stringArr; int size=4, i; stringArr=(char**)malloc(size*sizeof(char*)); for (i=0; i<size; i++) stringArr[i]=(char*)malloc(10*sizeof(char)); strcpy(stringArr[0], "abcdefgh"); strcpy(stringArr[1], "good-luck"); strcpy(stringArr[2], "mully"); strcpy(stringArr[3], "stam"); for (i=0; i<size; i++) { printf("%s\n", stringArr[i]); printf("%d %u\n\n", &(stringArr[i]), stringArr[i]); } 输出: abcdefgh 9650064 9650128 祝你好运9650068 9638624 mully 9650072 9638680 stam 9650076 9638736

在Mac OS 10.6上执行简单的缓冲区溢出

我正在尝试了解堆栈基础溢出并编写一个简单的代码来利用堆栈。 但不知怎的,它根本不起作用,只显示我的机器上的Abort陷阱(mac os豹) 我想Mac os对待溢出的方式不同,它不允许我通过c代码覆盖内存。 例如, strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes 在Linux机器上,此代码成功覆盖下一个堆栈,但在mac os上阻止(Abort trap) 任何人都知道如何在mac机器上执行简单的堆栈溢出?

编写一个返回libc攻击,但libc在内存中加载到0x00

我正在为我的系统安全类编写一个返回libc攻击。 首先,易受攻击的代码: //vuln.c #include #include int loadconfig(void){ char buf[1024]; sprintf(buf, “%s/.config”, getenv(“HOME”)); return 0; } int main(int argc, char **argv){ loadconfig(); return 0; } 我想使用返回libc攻击。 编译和调试程序: $ gcc -g -fno-stack-protector -o vuln vuln.c $ gdb vuln (gdb) break loadconfig (gdb) run Reached breakpoint blah blah blah. (gdb) p $ebp $1 = (void *) 0xbfffefb0 (gdb) […]

如果有人抱怨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)总是错误的,为什么没有警告,并且手册页中没有任何关于它的内容?

格式字符串攻击

我有一个小的C程序可以被利用。 而且我也理解了要执行的攻击背后的逻辑。 但是,尽管我尝试过,但这对我来说并不适用。 #include #include #define SECRET1 0x44 #define SECRET2 0x55 int main(int argc, char *argv[]) { char user_input[100]; int *secret; int int_input; int a, b, c, d; /* other variables, not used here.*/ /* The secret value is stored on the heap */ secret = (int *) malloc(2*sizeof(int)); /* getting the secret */ secret[0] […]

这个缓冲区溢出的后果?

所以在这里我相信我在查看其他人的代码时发现了一个小的缓冲区溢出问题。 它立刻让我觉得不正确,而且有潜在危险,但不可否认,我无法解释这个“错误”的实际后果,如果有的话。 我写了一个测试应用程序来演示错误,但发现(令我沮丧的是)无论溢出如何,它似乎都能正常运行。 我想相信这只是偶然的,但是需要一些反馈来确定我的想法是否错误,或者是否真的存在问题,而这些问题并没有在我的测试应用中显示出来。 问题代码(我认为无论如何): char* buffer = new char[strlen(“This string is 27 char long” + 1)]; sprintf(buffer, “This string is 27 char long”); 现在,这对我来说很突出,我想把它标记为可能的缓冲区溢出是因为第一个strlen 。 由于指针运算, + 1的’不正确’位置将导致strlen返回26而不是27 (取“他的字符串长度为27 char”)。 我相信sprintf 27个字符打印到缓冲区并导致缓冲区溢出。 这是正确的评估吗? 我写了一个测试应用程序来为我正在查看的代码演示这个,并发现即使在调试器中字符串也会正确打印。 我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否可以影响邻近的内存区域,但仍然收到正确的输出。 我意识到我新分配的堆内存可能不相邻,这可以解释缺乏有用的溢出,但我真的想确认其他人的意见,如果这实际上是一个问题。 由于这是一个非常简单的“问题”,如果你能通过某种参考来支持你的答案,那就太好了。 虽然我重视并欢迎您的意见,但我不会接受“是的”作为最终答案。 提前谢谢你。 更新:许多有很多额外见解的好答案。 不幸的是,我无法接受所有这些。 感谢您分享您的知识并成为我的“第二意见”。 我很感激帮助。

返回lib_c缓冲区溢出运行问题

我应该想出一个利用“返回libc缓冲区溢出”的程序。 执行时,它会干净地退出并显示SHELL提示符。 该程序在bash终端中执行。 以下是我的C代码: #include int main(int argc, char*argv[]){ char buffer[7]; char buf[42]; int i = 0; while(i < 28) { buf[i] = 'a'; i = i + 1; } *(int *)&buf[28] = 0x4c4ab0; *(int *)&buf[32] = 0x4ba520; *(int *)&buf[36] = 0xbfffff13; strcpy(buffer, buf); return 0; } 使用gdb ,我已经能够确定以下内容: “system”的地址:0x4c4ab0 “退出”的地址:0x4ba520 字符串“/ bin / sh”驻留在内存中:0xbfffff13 […]

缓冲区溢出攻击

我正在尝试执行一个非常简单的缓冲区溢出攻击。 我几乎是新手。 所以,如果这个问题很愚蠢,请原谅:-) 代码: #include #include int i, n; void confused(int i) { printf(“**Who called me? Why am I here?? *** %x\n “, i); } void shell_call(char *c) { printf(” ***Now calling \”%s\” shell command *** \n”, c); system(c); } void victim_func() { int a[4]; printf(“Enter n: “); scanf(“%d”,&n); printf(“~~~~~~~~~~~~~ values and address of n […]