我开始研究软件安全性,但我很难理解缓冲区溢出攻击和 ROP 攻击是什么。
据我了解,
缓冲区溢出攻击:
当缓冲区达到一定大小时,填充缓冲区并添加额外的代码,以便攻击者可以执行代码中的另一个函数或他/她自己的shellcode。
ROP攻击:
给出某个可以覆盖返回地址的输入,以便攻击者可以控制流量。
但两者之间的确切区别是什么?
我觉得两者都只是给出了过多的输入来覆盖不应该接近的区域。
例如,如果我有一个代码
1 #include <stdio.h>
2
3 void check(){
4 printf("overflow occurs!\n");
5 }
6
7 int main(int argc, char* argv[]){
8 char buffer[256];
9 gets(buffer);
10 printf("%s\n", buffer);
11 return 0;
12 }
Run Code Online (Sandbox Code Playgroud)
并尝试check()通过向函数提供特定输入来执行该函数gets()。
这是 ROP 攻击还是缓冲区溢出攻击?
我在编写需要该功能的程序时遇到了这个问题sprintf。
在某些情况下,使用该sprintf函数可能会导致内存溢出并带来安全风险。因此,您可以使用snprintf或sprintf_s函数来避免这些风险。
但这两个函数的定义是相同的。那么,为什么存在这两个函数而不是只有一个呢?
int sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...);
int snprintf(char *__restrict__ __stream, size_t __n, const char *__restrict__ __format, ...);
Run Code Online (Sandbox Code Playgroud)
一开始,我认为该sprintf_s函数是Windows库特有的,我也认为该snprintf函数是POSIX特有的。但事实上,这两个函数都包含在<stdio.h>库中。
说.Net平台更安全是否正确,因为CLR可以防止缓冲区溢出攻击?
假设有一个在托管操作系统中运行的Web浏览器(如Cosmos,SharpOS或Singularity),攻击者在技术上是否可以将IL代码注入应用程序?
我是否必须担心在非托管应用程序中无法进行的攻击?
最近有一个关于SO的问题(为什么有人会使用strncpy而不是strcpy?),这是hade的答案(答案1,答案2),这使我不确定其他字符串函数的名字中带有'n',如snprintf(我一直在广泛使用).snprintf可以安全使用吗?一般来说,'n'家族的安全功能是什么?
我正在阅读2010年CWE/SANS排名前25位最危险的编程错误,其中一个条目是缓冲区复制而不检查输入大小.它建议使用具有功能的语言来预防或缓解此问题,并说:
例如,许多执行自己的内存管理的语言(如Java和Perl)不会受到缓冲区溢出的影响.其他语言(如Ada和C#)通常提供溢出保护,但程序员可以禁用保护.
我不知道Java和C#在内存管理方面有任何有意义的不同.Java如何不受缓冲区溢出的影响,而C#只能防止溢出?如何在C#中禁用这种保护?
做强类型,在这种情况下char防止缓冲区溢出?
char a[100]
char b[100]
strcpy(a,unknownFunction); // unknownFunction could overflow b
// since its length is unknown
strcpy(b,a); // can b still overflow a with its now,
// potentially overflowed size?
Run Code Online (Sandbox Code Playgroud) 我正在做一个安全课程的任务,要求我找到备份程序(setuid)的4个漏洞,并使用它们中的每一个来获得root访问权限(在具有旧版gcc等的虚拟linux机器上).应该有一个缓冲区溢出和一个格式字符串.
谁能帮我指出4个漏洞在哪里?我认为缓冲区溢出可能发生在copyFile().
以下是backup.c的代码:(可以在"backup backup foo"或"backup restore foo"中调用)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#define CMD_BACKUP 0
#define CMD_RESTORE 1
#define BACKUP_DIRECTORY "/usr/share/backup"
#define FORBIDDEN_DIRECTORY "/etc"
static
int copyFile(char* src, char* dst)
{
char buffer[3072]; /* 3K ought to be enough for anyone*/
unsigned int i, len;
FILE *source, *dest;
int c;
source = fopen(src, "r");
if (source == NULL) {
fprintf(stderr, "Failed to open source file\n");
return -1; …Run Code Online (Sandbox Code Playgroud) 这与C++中的字符串有关.我很长时间没有接触过C/C++; 事实上,大约7年前,我只在大学的第一年用这些语言编程.
在C中保存字符串我必须创建字符数组(无论是静态的还是动态的,都不需要考虑).这意味着我需要提前猜出数组将包含的字符串的大小.我在C++中应用了相同的方法.我知道有一个std :: string类但我从来没有使用它.
我的问题是,因为我们从未在std :: string类中声明数组/字符串的大小,所以在写入时会发生缓冲区溢出.我的意思是,在C中,如果数组的大小是10并且我在控制台上键入了超过10个字符,那么额外的数据将被写入到与数组相邻的其他对象的内存位置.使用cin对象时,std :: string中是否会发生类似的事情.
使用std :: string时,我是否必须在C++之前猜测字符串的大小?
好!谢谢大家.这个页面上没有一个正确的答案(提供了很多不同的解释),所以我没有选择任何一个这样的答案.我很满意第一个5.小心!
我试图让替换所有出现的功能str1在文本t与str2,但我不断收到一个"缓冲区溢出"错误消息.你能告诉我我的功能有什么问题吗?
#include <stdio.h>
#include <string.h>
#include <assert.h>
//replace all *str1 in *t with *str2, put the result in *x, return *x
char * result(char *str1,char *str2,char *t)
{
char *x=NULL,*p=t,*r=t;
x=malloc(400*sizeof(char));
assert(x!=NULL);
x[0]='\0';
r=strstr(t,str1); //r is at the first occurrence of str1 in t, p is at the beginning of t
while(r!=NULL)
{
strncat(x,p,r-p); //copy r-p chars from p to x
strcat(x,str2); //copy str2 to x
p=r+strlen(str1); //p will be at the …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过此链接跟踪有关缓冲区溢出的视频指南 ,下面是我正在尝试的代码。
#include <stdio.h>
GetInput()
{
char buffer[8];
gets(buffer);
puts(buffer);
}
main()
{
GetInput();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在gdb调试中遇到了麻烦,而在第7行进入ie时,出现以下错误:
#include <stdio.h>
GetInput()
{
char buffer[8];
gets(buffer);
puts(buffer);
}
main()
{
GetInput();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在按照与教程中所述完全相同的步骤进行操作。我在虚拟机上使用32位Kali Linux
谁能帮助我解决这个问题。