微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用fgets在C程序上利用

如何解决使用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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。