【发布时间】:2021-02-21 06:31:16
【问题描述】:
这是我考试中的一个问题,发生在当天早些时候:
考虑下面的代码 sn-p。攻击者的目标是执行攻击者选择的代码,例如生成一个 shell,或者擦除文件系统的内容。
/* barfoo is called with a non-zero value if the user is
authenticated. Else it is called with 0.*/
void barfoo (int authstatus) {
char packet[1024];
fgets (packet, 1023, stdin);
if(authstatus != 0) system (packet);
else syslog ("Not authorised to process packet");
return;
}
Q1:假设我要在启用堆栈金丝雀的情况下编译这个程序。假设 libc 未在启用堆栈金丝雀的情况下编译。攻击者能否利用该程序?
Q2:假设我要在启用堆栈金丝雀(返回地址保护)的情况下编译这个程序。假设 libc 是在启用堆栈金丝雀的情况下编译的。攻击者能否利用该程序?
Q3:假设我要在启用了不可执行页面(即 W-xor-X 保护)的系统上运行此程序。攻击者能否利用该程序?
他们三个的答案显然都是肯定的,但我不知道如何。
在第一季度和第二季度,为了实现缓冲区溢出,我们必须覆盖金丝雀,这会在代码执行时引发异常。
我们可以尝试使用 ROP(面向返回的编程)攻击,但要执行该攻击,我们需要指向缓冲区的开头,因此,我们需要覆盖堆栈上的返回地址。我也看不到我们如何进行格式字符串利用或类似的事情。
另外,在这种情况下,由于我们使用 fgets() 而不是 gets() 来读取输入,所以它会在 1022 个字符后停止读取,那么我们还能如何利用该程序呢?
我在原始 ROP 论文中读到,我们可以使用帧指针覆盖,但我不确定这意味着什么,也不知道这在这里究竟是如何工作的。
任何指示都会有所帮助,谢谢。
【问题讨论】:
-
我不知道
fgets具有正确大小的缓冲区如何用于溢出缓冲区。authstatus是什么? -
@Jabberwocky 这本身不是真实世界的代码——我们只得到了这个代码 sn-p 但我想“authstatus”只是一个用于检查身份验证的变量,因为代码中的注释说。
-
您无法利用对
fgets()的调用来执行堆栈粉碎或类似操作。但是,由于authstatus的any 非零值提供了shell 访问,因此该函数可能与程序中其他地方的漏洞结合使用。没有其他代码可以查看吗? -
@r3mainer 很遗憾,没有。这是整个问题。但是,导师确实给了我们一个提示,漏洞不在 fgets() 中,而是在其他地方。我想您可能会以某种方式更改或破坏
authstatus的值,但由于这将“高于”返回地址,我不确定这是如何发生的。
标签: c security buffer-overflow exploit