我遇到过一个存在缓冲区溢出缺陷的 C 程序。 我们需要让这个计划按照我们的方式运作。根据我的理解,缓冲区溢出将覆盖下一个内存位置。如果我们考虑以下代码,如果密码是 goodpassword,程序就会授予访问权限。我想利用缓冲区溢出缺陷并将输入指定为 aaaaaaaaaaaaaaaaaaaaaaaa (24 a) 来覆盖下一个内存位置,以便程序接受以下输入授予访问权限。
然而,它不起作用,因为我认为该程序正在崩溃并且我无法利用该缺陷。您能让我知道我的方法出了什么问题吗?
#include <stdio.h>
#include <string.h>
int IsPasswordOk( ) {
char password[13];
gets(password);
if(!strcmp(password,"goodpassword"))
return 1;
else
return 0;
}
int main(int argc, char* argv[]) {
int pwdStatus;
puts("Enter password");
pwdStatus = IsPasswordOk();
if(!pwdStatus) {
puts("Access denied!");
return -1;
}
else puts("Access granted!");
return 0;
}
溢出不一定总是指向有效位置。假设一个场景,下一个位置可能位于下一页,而您无权访问它。这取决于您的操作系统发行版如何处理这种情况。
简单的答案,您无需溢出此处的缓冲区即可获得访问权限。由于该程序所做的只是将您的输入与固定字符串进行比较,因此只需提供该值即可。您使这个问题变得过于复杂,也无需覆盖现有变量,以防它用某个值初始化并与其他值进行比较,并且您无法控制输入,但这很简单,即使如果你有缓冲区溢出,你会用它做什么,没有你想调用的函数或你想覆盖的变量。如果您想了解何时利用缓冲区溢出以及发生缓冲区溢出时该怎么做,请查看此 github 存储库 https://github.com/Jeetu855/Binary-Exploitation