使用fgets在C程序上利用

问题描述

这是我考试的一个问题,发生在当天早些时候:

请考虑以下代码段。攻击者的目标是执行攻击者选择的代码,例如,生成外壳程序或擦除文件系统的内容。


/* 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保护)的系统上运行此程序。攻击者可以利用此程序吗?

这三个问题的答案都是肯定的,但我不知道如何。

在Q1和Q2中,为了进行缓冲区溢出,我们必须覆盖canary,这将在代码执行时引发异常。

我们可以尝试使用ROP(面向返回的编程)攻击,但是要执行该操作,我们需要指向缓冲区的开头,因此,我们需要覆盖堆栈上的返回地址。我也看不到如何进行格式字符串利用或类似操作。

此外,在这种情况下,由于我们使用fgets()而不是gets()来读取输入,因此它将在这里停止读取1022个字符之后,那么我们还可以如何利用该程序?

我在原始ROP文件中读到我们可以使用帧指针覆盖,但是我不确定这意味着什么,或者在这里到底是如何工作的。

任何方向都会有所帮助,谢谢。

解决方法

与其他评论者一样,我非常确定fgets调用本身不能被利用。但是请看syslog https://linux.die.net/man/3/syslog的参数:

void syslog(int priority,const char *format,...);
//versus
syslog ("Not authorised to process packet");

如果它开始在堆栈中的某处寻找其格式字符串,我想知道是否可以说服它尝试packet的内容。

,

stdin 是一个 FILE 结构,可以被覆盖,通过 vtable 指针触发函数调用(如果它被操纵)

https://seb-sec.github.io/2020/04/29/file_exploitation.html https://github.com/CptGibbon/House-of-Corrosion

这假设其他原语可用并且已经被使用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...