【问题标题】:Format String Attack in CC中的格式化字符串攻击
【发布时间】:2011-08-16 02:53:21
【问题描述】:

我正在研究一个安全单元,并试图理解格式字符串攻击。有人可以尝试向我解释一下吗?

以下代码摘自:http://julianor.tripod.com/bc/tn-usfs.pdf:

/*
 * fmtme.c
 *       Format a value into a fixed-size buffer
 */
#include <stdio.h>
int
main(int argc, char **argv)
{
    char buf[100];
    int x;
    if(argc != 2)
        exit(1);
    x = 1;
    snprintf(buf, sizeof buf, argv[1]);
    buf[sizeof buf - 1] = 0;
    printf("buffer (%d): %s\n", strlen(buf), buf);
    printf("x is %d/%#x (@ %p)\n", x, x, &x);
    return 0;
}

据我了解,%n 格式说明符用于将指定地址读回内存,然后当printf 将值从堆栈中弹出时,它应该读取我们的地址。我似乎无法解决这个问题。

文档中提供了以下示例:

perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"'

\x58\x74\x04\x08%d%n 是从哪里来的?

【问题讨论】:

    标签: c string security printf format-string


    【解决方案1】:

    “\x58\x74\x04\x08%d%n”是“shell代码”。

    该文档中对漏洞利用进行了非常详细的解释。我想它希望您对堆栈帧的典型布局有所了解,这也在表格中进行了说明。请记住,堆栈地址通常会向下增长,这意味着“弹出”比实际传递给它的参数更多的函数调用将开始从它自己的堆栈帧中读取局部变量。这就是这个 shell 代码所利用的。

    它将地址放在buf 的前 4 个字节中(因为 snprintf 将其打印到那里),然后它跳过 x 变量(从它下面的框架中),最后从buf(但被解释为指针)并通过 %n 格式代码向其写入值。

    【讨论】:

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