【问题标题】:Format strings and using %n to overwrite memory address with specific value格式化字符串并使用 %n 用特定值覆盖内存地址
【发布时间】:2013-10-10 14:16:08
【问题描述】:

我正在阅读并尝试了解格式字符串漏洞。我有一个易受攻击的函数,并且我了解我对格式字符串的处理要点。

基本上,这就是我想做的。传入我的格式字符串,其中包含一些 shellcode 作为它的一部分。我还需要格式化我的字符串,以便替换易受攻击函数的返回地址,使其指向我在堆栈上的 shellcode。因此,当函数返回时,它会跳转到我在堆栈上的 shellcode 并打开一个 shell。

目前,我可以在堆栈上看到我的 shellcode,并且可以写入返回地址来更改它。问题是,我使用 %n 作为覆盖返回地址的方式,但不确定如何让 %n 用特定值覆盖。当然, %n 只是打印到目前为止写入堆栈上指定地址的字节数。我已经阅读了几篇关于如何操纵 %n 以写入所需的确切地址/值的内容,但我不知道如何做到这一点。

谁能解释一下?

编辑: 我尝试用诸如“%500d”和“%.500d”之类的东西填充我的格式字符串,以及一些 n 值的“%nu”。(我也尝试过更小的值)但这只会带来分段错误。

为了消除一些困惑,这是我为回应评论而写的一个简单示例:

好的,我会尽量说清楚一点。我有一个易受攻击的程序。漏洞点是“printf(input);”。我想通过传入格式字符串来利用它。现在例如,我有一个格式字符串

"\x0c\xde\xbf\xff%08x.%08x.%08x.%08x.%08x.%08x.%n" 

这个格式字符串,当传递给易受攻击的函数时,会用写入的字节数覆盖内存地址 0xffbfde0c。我正在寻找如何修改该格式字符串,以便通过以某种方式填充 %n 之前写入的字节数来使 %n 覆盖特定值。

【问题讨论】:

  • 你有什么问题?
  • 我的问题是如何使用 %n (在我的格式字符串中)打印我想要的任何值(读取:地址)。
  • %n 用于格式字符串漏洞,用于覆盖内存而不是读取内存。使用%x 转储内存。
  • 抱歉,我的措辞可能不正确。我正在尝试使用 %n 覆盖内存。我只是想弄清楚如何用 %n 控制新值。基本上,我想使用 %n 用特定值覆盖内存。

标签: c security format-string


【解决方案1】:

%n 写出数字的唯一方法是让printf 打印出这个数字。要获取任何指针的值,您需要打印许多字节。

最简单的方法是%999999s

此外,尝试将返回值定向到某个函数(也称为“返回 libc”)可能更容易,因为代码通常位于相对较低的地址中。

【讨论】:

  • 可能%999d%999s好,避免从随机地址读取字符串
  • 如果我尝试在格式字符串的末尾添加 %nd,无论 n 的值是什么,似乎都会出现分段错误。
【解决方案2】:

由于四年前提出的问题,我认为答案可能不是那么有用。我遇到了同样的问题,并找到了一个捷径来做到这一点。正如材料所说,使用 %hhn 会是一个更好的方法,去掉这么多字节。

为此,我们使用格式指令标志 h,它指定使用一半格式。因此,例如,如果我们使用 %hn,那么我们将格式化字节数写入一个 2 字节的短值。如果我们使用 %hhn,那么我们将格式化字节数写入一个 1 字节的 char 值。 materials

这样的例子

"AAAA\x4c\xfd\xff\xbf%08x.%08x.%08x.%08x.%08x.%08x.%hhn"

'A' 可以多到匹配所需的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多