gpt4 book ai didi

c - 使用 snprintf 的缓冲区溢出

转载 作者:太空狗 更新时间:2023-10-29 15:39:16 25 4
gpt4 key购买 nike

这是一项作业,但我的基本理解有问题。

易受攻击的代码:

int choc(char *arg)
{
char buf[400];
snprintf(buf, sizeof buf, arg);
return 0;
}

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

因此,格式字符串需要具备的东西:

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

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

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

如有任何帮助,我们将不胜感激!

最佳答案

"\xa0\xfb\xff\xbf" 不应该是 buf 的地址,而是返回地址在堆栈上的位置(这是您希望覆盖的值) .您必须使用 gdb 找到该值。

然后您需要在您的格式字符串中放置足够的 %x 以便您的 %n 将从堆栈中读取该值并写入您指定的地址。您还需要使用正确的字段大小,以便 %n 实际上写入正确的值。

关于c - 使用 snprintf 的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10112984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com