使用 snprintf 的缓冲区溢出

Cat*_*tie 5 c buffer

这是一项作业,但我在基本理解方面遇到了问题。

易受攻击的代码:

int choc(char *arg)
{
  char buf[400];
  snprintf(buf, sizeof buf, arg);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道 arg 需要是一个格式字符串,它将用我要执行的代码的地址覆盖返回地址。但是我在创建格式字符串时遇到了问题。

因此,格式字符串需要具备的内容:

  1. 返回指令的地址,我需要覆盖它
  2. %x 的列表
  3. 我会写在返回地址上的值。这将是我要执行的代码的地址。

为了获得返回地址,我只需要查看gdb中'ret'指令的地址,对吗?%x 的目的究竟是什么?以及如何在格式字符串中对要执行的代码的地址进行编码?

我做的一个测试:使用gdb我发现我的buf的地址是0xbffffba0。我生成的 arg 为 "\xa0\xfb\xff\xbf_%x.%x.%n"; 这不应该在地址 0xbffffba0 处向 buff 的开头写入一些值吗?但是我得到了一个段错误。我究竟做错了什么?

任何帮助,将不胜感激!

小智 1

您尝试利用的漏洞称为格式字符串漏洞。为了进一步研究这个主题,我会推荐这个链接或名为“黑客:利用的艺术”的书。