【问题标题】:How to write value into an address in format string attack如何在格式字符串攻击中将值写入地址
【发布时间】:2011-06-18 19:35:34
【问题描述】:

我正在学习安全课程,需要我们对 unix 虚拟机进行格式字符串攻击。该漏洞是使用命令行参数的格式字符串。

我的问题是如何将值写入格式字符串的地址(如将 shell 代码地址写入函数返回地址)?

例如,我尝试将值 987654 写入返回地址位置 0xaabbccdd。 我尝试了一些像"AAAA_%10$x"这样的字符串,这可以导致程序打印AAAA_41414141

然后我用我的地址替换字母并尝试覆盖它。

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n"

但它不起作用。我看到一篇文章说我应该在%54321x 中使用较小的数字,因为我已经写了一些字符,但我也不知道我在%54321x 之前写了多少个字符。

注意:环境有老版本的gcc,不用担心值太大。 有什么建议?谢谢。

【问题讨论】:

    标签: c string security format-string


    【解决方案1】:

    printf 不能在不使用%n 格式说明符的情况下写入任何位置。这是你缺少的那个。 %.987654d%n 之类的东西会将数字 987654(到目前为止输出的字符数)写入第二个参数指定的地址,其中第一个参数是 int。这应该足以让您入门。

    【讨论】:

    • sprintf 写入堆栈上的字符缓冲区也可能被用于恶意破坏...
    • @Oli:是的,但这不是格式字符串攻击,OP 的任务似乎是关于...
    • 我几乎不称其为格式字符串漏洞,只是普通的strcpy 缓冲区溢出。使用sprintf 而不是strcpy 这一事实相当偶然。
    【解决方案2】:

    您应该使用 %n 格式化程序指定要写入的堆栈偏移量,例如 %[offset]\$n

    示例:%23\$n

    确保通过检查 \xdd\xcc\xbb\xaa_%54321x_%[offset]\$x" 的结果来正确获取正确的地址,这可以通过 python 或 bash 脚本完成

    你应该检索地址aabbccdd

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2021-02-01
      • 2012-11-04
      • 2015-01-17
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多